NAV Navigation
cURL Node.JS PHP CLI
Landing image that shows people working with an API to create a rocket ship
API reference

Overview

The Shutterstock API provides access to Shutterstock's library of media, as well as information about customers' accounts and the contributors that provide the media. It allows customer platforms to search for media, view information and previews for the media, and license and download media.

This documentation provides information about each endpoint in the API. The right-hand pane of this page shows example requests and responses for each endpoint in cURL, Node.js/JavaScript, PHP, and the Shutterstock command-line client.

You can also load a collection of the endpoints into the REST API client Postman by clicking this button:

For FAQs about the API, see Frequently asked questions.

Getting started

Follow these steps to start licensing media:

  1. Create an application. To license media, you also need a paid subscription, but the API provides a free option for you to try out the API and license media from Shutterstock's free media collection. For information about applications and subscriptions, see Subscriptions.
  2. Authenticate to the API to get a token. Authentication is required for all endpoints in the Shutterstock public API. The API accepts HTTP basic authentication for some endpoints and OAuth authentication for all endpoints. See Authentication.
  3. Use the GET /v2/user/subscriptions endpoint to get your subscription ID.
  4. Use the licensing endpoint for the media type to license media, such as the POST /v2/images/licenses endpoint for images.

Examples

This API reference includes examples in several programming languages. Most of the examples assume that your OAuth token is in the SHUTTERSTOCK_API_TOKEN environment variable.

Examples for cURL

The cURL examples work on the command line of many operating systems, including Windows, MacOS, and Linux, though you may need to install the cURL program.

Examples for the Shutterstock CLI

The examples for the Shutterstock command-line client work on the command line of many operating systems. To install the CLI, run pip install shutterstock-cli.

The Shutterstock CLI requires Python version 3 and the pip package manager.

The CLI uses these environment variables:

Examples for JavaScript and Node.JS

The examples for JavaScript and Node.JS use the Shutterstock JavaScript SDK. To install the SDK, run yarn add shutterstock-api or npm install shutterstock-api --save from the command line.

As an alternative to using the SDK, you can make requests with any JavaScript HTTPS request library. Regardless of which library you use, you must ensure that your request includes the user-agent header. Some libraries include this header automatically and others do not.

Examples for PHP

The PHP examples requires PHP 5.4 or greater, plus the curl and json modules.

Basic requests

Basic request: searching for images

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=hiking" \
  --data-urlencode "image_type=photo" \
  --data-urlencode "orientation=vertical" \
  --data-urlencode "people_number=3"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query hiking \
  --image-type photo \
  --orientation vertical \
  --people-number 3
$queryFields = [
  "query" => "hiking",
  "image_type" => "photo",
  "orientation" => "vertical",
  "people_number" => 3
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "query": "hiking",
  "image_type": ["photo"],
  "orientation": "vertical",
  "people_number": 3
};

imagesApi.searchImages(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

After you have authenticated to the API, you can send requests to the API using any programming language or program that can send HTTP requests. The base URL for all endpoints is https://api.shutterstock.com. For examples, see the right-hand pane.

Languages

Get the list of image categories in Spanish

curl -X GET "https://api.shutterstock.com/v2/images/categories" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "language=es"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images list-image-categories \
  --language es
$queryFields = [
  "language" => "es"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/categories?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "language": "es"
};

imagesApi.listImageCategories(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Example response

[
  {"id":"26","name":"Abstractos"},
  {"id":"1","name":"Animales/ Naturaleza"},
  {"id":"11","name":"Las Artes"},
  {"id":"3","name":"Fondos/Texturas"},
  {"id":"27","name":"Belleza/Moda"},
  {"id":"2","name":"Edificios/Lugares Famosos"},
  {"id":"4","name":"Negocios/Finanzas"},
  {"id":"5","name":"Educación"}
]

Some endpoints can accept or return some data in multiple languages. Not all response data is translated, and not all endpoints support languages other than English. Different endpoints support different language features:

To search or return data in a language other than English, pass the language code (such as fr or zh-Hant) in the language query parameter or the Accept-Language header, as in the example in the right-hand pane.

For the list of languages that the API accepts, see the Language schema.

Responses

Example search response

{
  "page": 1,
  "per_page": 1,
  "total_count": 1070,
  "search_id": "rTBCE8T2weANh6pK85Fdvw",
  "data": [
    {
      "id": "1105302317",
      "aspect": 0.6667,
      "assets": {
        "preview": {
          "height": 450,
          "url": "https://image.shutterstock.com/display_pic_with_logo/3265442/1105302317/stock-photo-a-woman-with-children-goes-hiking-the-woman-took-her-sons-by-the-arms-the-family-goes-on-a-dirt-1105302317.jpg",
          "width": 300
        },
        "small_thumb": {
          "height": 100,
          "url": "https://thumb7.shutterstock.com/thumb_small/3265442/1105302317/stock-photo-a-woman-with-children-goes-hiking-the-woman-took-her-sons-by-the-arms-the-family-goes-on-a-dirt-1105302317.jpg",
          "width": 67
        },
        "large_thumb": {
          "height": 150,
          "url": "https://thumb7.shutterstock.com/thumb_large/3265442/1105302317/stock-photo-a-woman-with-children-goes-hiking-the-woman-took-her-sons-by-the-arms-the-family-goes-on-a-dirt-1105302317.jpg",
          "width": 100
        },
        "huge_thumb": {
          "height": 260,
          "url": "https://image.shutterstock.com/image-photo/woman-children-goes-hiking-took-260nw-1105302317.jpg",
          "width": 173
        },
        "preview_1000": {
          "url": "https://ak.picdn.net/shutterstock/photos/1105302317/watermark_1000/af3ff3de71d94d7739337e0c35debfb3/preview_1000-1105302317.jpg",
          "width": 667,
          "height": 1000
        },
        "preview_1500": {
          "url": "https://image.shutterstock.com/z/stock-photo-a-woman-with-children-goes-hiking-the-woman-took-her-sons-by-the-arms-the-family-goes-on-a-dirt-1105302317.jpg",
          "width": 1000,
          "height": 1500
        }
      },
      "contributor": {
        "id": "3265442"
      },
      "description": "A woman with children goes hiking. The woman took her sons by the arms. The family goes on a dirt road. The boy walks with his brother and mother in the forest. Hike with backpacks. Fisheye lens",
      "image_type": "photo",
      "media_type": "image"
    }
  ],
  "spellcheck_info": {}
}

Successful requests return a 200, 201, or 204 response code. For error responses, see Errors.

Some endpoints return information in JSON format. In most cases, the metadata is in the root fields of the JSON data, and the data about the media is in a data field. Most programming languages have libraries that can accept and manipulate JSON data.

Some API subscriptions return a limited set of results. See Subscriptions.

Paging responses

Paging search results

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=giraffes" \
  --data-urlencode "page=2" \
  --data-urlencode "per_page=5"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query giraffes \
  --page 2 \
  --per-page 3
$queryFields = [
  "query" => "giraffes",
  "page" => 2,
  "per_page" => 5
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "query": "giraffes",
  "page": 2,
  "per_page": 5
};

imagesApi.searchImages(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Many endpoints, including search endpoints, split long response data into multiple pages with the page and per_page parameters. For example, if a search result has 20 pieces of media, you can retrieve items 6-10 by using page=2 and per_page=5 in the request, as shown in the examples in the right-hand pane. You can show up to 500 results per page for most requests. Some endpoints have different limits; see the description of the per_page parameter for the individual endpoints.

Sorting results

Sorting search results

curl -X GET "https://api.shutterstock.com/v2/videos/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=boats" \
  --data-urlencode "sort=popular"


curl -X GET "https://api.shutterstock.com/v2/audio/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "instruments=Piano" \
  --data-urlencode "duration_from=300"
  --data-urlencode "sort=bpm" \
  --data-urlencode "sort_order=desc"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos search-videos \
  --query boats \
  --sort popular

shutterstock audio search-tracks \
  --instruments Piano \
  --duration-from 300 \
  --sort bpm \
  --sort-order desc
$videoQueryFields = [
  "query" => "boats",
  "sort" => "popular"
];

$videoOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/search?" . http_build_query($videoQueryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$videoHandle = curl_init();
curl_setopt_array($videoHandle, $videoOptions);
$videoResponse = curl_exec($videoHandle);
curl_close($videoHandle);

$videoDecodedResponse = json_decode($videoResponse);
print_r($videoDecodedResponse);


$audioQueryFields = [
  "query" => "Piano",
  "duration_from" => 300,
  "sort" => "bpm",
  "sort_order" => "desc"
];

$audioOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/search?" . http_build_query($audioQueryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$audioHandle = curl_init();
curl_setopt_array($audioHandle, $audioOptions);
$audioResponse = curl_exec($audioHandle);
curl_close($audioHandle);

$audioDecodedResponse = json_decode($audioResponse);
print_r($audioDecodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const videoQueryParams = {
  "query": "boats",
  "sort": "popular"
};

videosApi.searchVideos(videoQueryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

const audioApi = new sstk.AudioApi();

const audioQueryParams = {
  "query": "Piano",
  "duration_from": 300,
  "sort": "bpm",
  "sort_order": "desc"
};

audioApi.searchTracks(audioQueryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

The sort parameter controls how results are ordered. By default, image and video searches return the most popular media first. Audio searches without the sort parameter return tracks based on the popularity of that track in the location of the request.

The image and video search endpoints can order results in the following ways:

The audio search endpoint can sort results in the following ways:

For audio only, you can use the sort_order parameter to return results in ascending ("asc") or descending ("desc", the default) order.

Compressing results

To save bandwidth, you can compress API responses by passing the header Accept-Encoding: gzip. The API returns the JSON results as usual, but they are compressed into a gzip file. It is up to you to save and extract the compressed file.

Full view and minimal view

Showing full detail in the results

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=airplane" \
  --data-urlencode "view=full"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query airplane \
  --view full
$queryFields = [
  "query" => "airplane",
  "view" => "full"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "query": "airplane",
  "view": "full"
};

imagesApi.searchImages(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

The view parameter on some search and informational endpoints controls how much detail is shown in the response. By default (view=minimal), the response includes a moderate amount of detail about each search result, but if you set the view parameter to full, the response includes complete information about each result. For example, full image results include the full list of keywords and categories that apply to each image.

For examples of the results, see Results.

Showing only specific fields

Image search with fields parameter

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=dolphins" \
  --data-urlencode "fields=data(id,assets/preview/url)"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query dolphins \
  --fields "data(id,assets/preview/url)"
$queryFields = [
  "query" => "kites",
  "fields" => "data(id,assets/preview/url)"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const axios = require("axios");

axios.get("https://api.shutterstock.com/v2/images/search", {
  "params": {
    "query": "kites",
    "fields": "data(id,assets/preview/url)"
  },
  "headers": {
    "Authorization": `Bearer ${process.env.SHUTTERSTOCK_API_TOKEN}`,
    "User-Agent": "request"
  }
})
  .then(({ data }) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Example response

{
  "data": [
    {
      "id": "547308685",
      "assets": {
        "preview": {
          "url": "https://image.shutterstock.com/display_pic_with_logo/567127/547308685/stock-photo-dolphin-547308685.jpg"
        }
      }
    },
    {
      "id": "794200186",
      "assets": {
        "preview": {
          "url": "https://image.shutterstock.com/display_pic_with_logo/1758188/794200186/stock-vector-silhouettes-of-dolphins-set-vector-illustration-794200186.jpg"
        }
      }
    },
    {
      "id": "388057081",
      "assets": {
        "preview": {
          "url": "https://image.shutterstock.com/display_pic_with_logo/324673/388057081/stock-photo-three-beautiful-dolphins-jumping-over-breaking-waves-hawaii-pacific-ocean-wildlife-scenery-marine-388057081.jpg"
        }
      }
    }
  ]
}

You can limit the information shown further with the fields parameter. You pass one or more fields and the API returns only those fields. The examples in the right pane perform an image search and return only the ID of the image and a link to a preview image. The value of the fields parameter specifies fields in the same way that Google supports it across many of their APIs. For more information, see Partial responses in the Google API documentation.

To specify the fields to return, use slashes to indicate the position of the field in the hierarchy of the normal JSON response. For example, the value data(id,assets/preview/url) returns the data.id field and the data.assets.preview.url field.

The JavaScript SDK does not support the fields parameter, so you must use an HTTP request library as in the example in the right-hand column.

Errors

The API returns error codes such as 400, 403, 404, and 500 along with information about the error. Here are some common error responses:

{
  "message": "Validation failed",
  "errors": [
    {
      "code": "VALIDATION_OBJECT_REQUIRED",
      "message": "Missing required property: name",
      "path": "$.body.name"
    }
  ]
}

A 400 Bad Request response often means that the request body is improperly formatted or missing required fields. In the case of missing fields, the response includes the name of the field that is missing, as in the example in the right-hand column.

A 401 Unauthorized response often means that the request did not include a valid OAuth token or basic authentication credentials. See Authentication.

A 403 Forbidden response can mean that the token in the request does not contain the scopes that the endpoint requires.

A 404 Not Found response can mean that the media, license, or collection you are trying to access does not exist.

A 500 Internal Server Error response means that an error happened on the server. This can mean that the request is not valid, such as if you try to delete or edit a collection that does not exist, or if the API otherwise can't do what you requested. It can also mean a temporary problem with the API. Check your request and try again or contact us.

Licensing errors

Licensing error response

{
  "data": [
  {
    "image_id": "14204581221111111",
    "error": "Media unavailable"
  }
],
"errors": [
  {
    "message": "Failed to license 1 image",
    "items": [
      {
        "image_id": "14204581221111111",
        "index": 0
      }
      ]
    }
  ]
}

The licensing endpoints return the same errors as other endpoints for authentication problems, such as if the token is not valid. For other problems, such as if the requested media is not found, the licensing endpoints return a 200 OK response and an error message in the response body.

For example, if you try to license an image but provide an invalid image ID, the response body includes the message "Media unavailable," as in the example in the right-hand column.

Rate limits

All applications are limited to a certain number of API requests per minute. If your application exceeds its limit, the API returns an error response with a status code of 429. The message in the response states the UTC time in milliseconds for when the application's quota renews, as in this example:

{
    "message": "Too many requests",
    "limit": 1000,
    "remaining": 0,
    "reset": 1624268836452
}

You can also access rate limit information from all requests via the response headers in the API response:

To request a higher rate limit, contact us.

Subscriptions

To access the API, you need an API application and either a free or paid API subscription. The type of subscription determines which media library you have access to and what level of access you have to other features such as reverse image search. To set up a paid API subscription, see the API subscription page. To set up a free API subscription, create an application and select the free subscription as described in Applications.

These API subscriptions are separate from the subscriptions that are available on the Shutterstock web site, so be sure to get an API subscription if you want to work with the API. See https://www.shutterstock.com/api/pricing.

You can use an API subscription to license and download media only with the API; API subscriptions don't work on the Shutterstock web site. If you have a subscription that does not include API access and want to use it with the API, contact us.

To get your subscription ID, use the GET /v2/user/subscriptions endpoint. To test your subscription, see Licensing sandbox.

Subscription features

This table summarizes what you can do with each type of API subscription. For specifics about your subscription, refer to your account.

Capability Free API subscription Standard API subscription Enterprise API subscription
Media library access Free library Expanded library Complete Shutterstock library
Maximum API requests per minute Limited Limited Custom
Number of search results Limited Limited Unlimited
License and download images Yes Yes Yes
View image, video, and track details Yes Yes Yes
Create collections Yes Yes Yes
Access unwatermarked images Free image collection only Yes Yes
Use reverse image search and similar image search Limited Limited Custom
Use AI search No No Custom
Generate custom music Limited Limited Custom
Embed Shutterstock Editor No No Yes

Media libraries

Each type of subscription provides access to a specific media library; all API requests use only the media in that library, including search, details, and licensing requests. For example, when you search with a free subscription, the results are limited to images in the Free stock photos collection. For this reason, you might see different media by searching on the API versus searching on shutterstock.com. Before trying to license media, make sure that you can access it through the API with your API subscription.

Applications

To access the REST API you need an application, which represents the application, program, or computer commands that are accessing the API. To use the API, you need the application's consumer key and consumer secret, which are shown on the https://www.shutterstock.com/account/developers/apps page.

When you have the application's consumer key and consumer secret, you can use them to access the API directly or to request a token that you can use to access the API. For more information on these methods of authentication, see Authentication.

Your application can use an existing API subscription or you can start a free subscription when you create the application.

To create an application:

  1. Log in at shutterstock.com, go to your account page, and click Developers.
  2. On the Developers page, click Create new app.
  3. On the Create New App popup, fill in these fields:
    • App name: Specify any name that describes your application.

    • Callback URL: Specify a comma-separated list of the host names and paths (not full URLs) where your application is running, such as "mycompany.com/myApplication." If you’ve got an application running on a server, use the host name of the server and path to the application. Otherwise, leave the default host name localhost for testing purposes.

    • Referrer: If you are creating a front-end or client-side integration or using one of Shutterstock's front-end integrations, such as the Shutterstock UI search widget, specify a comma-separated list of valid referrer domains and paths, such as "mycompany.com/myApplication." Each item in the list must match one of the callback host names.

      When you add paths to this list, the API accepts requests with an HTTP Referer header from one of these paths and with the API key in the api_key query parameter. Front-end integrations often use this style of authentication to hide secrets from the end user.

    • Included products: This list shows the API products that the application has access to. To get access to other products, contact your Shutterstock representative, visit the Pricing page or contact us.

    • Subscription: Optionally, select this check box to start a free subscription or use your existing free subscription. If you have a paid subscription, you can use it with any of your applications.

    • Company name: The name of your company.

    • Website: Your company's web site.

    • Intended use: Select an option that describes how you will use the API.

    • Description: Describe in detail how the application will use the API.

    • Terms of service: Read an accept the Terms of Service.

  4. Click Save.

The new application appears on the My apps page. Each application has a consumer key and a consumer secret. You use this consumer key and consumer secret either to use the API directly with basic authentication or to request a token for OAuth authentication; see Authentication. Do not share your key and secret, because they can be used to access your account through the API.

Products

Each application has access to one or more API products. These products control the media library that the application accesses and whether the application can access other features such as reverse image search. These products are separate from the subscriptions that control how many assets you can license and download and what level of access the application has to other features.

To tell which API products your application is using, open your applications, expand your application, and go to its Details tab.

Authentication

All endpoints in the Shutterstock API require authentication. The API accepts HTTP basic authentication for some endpoints and OAuth authentication for all endpoints.

All requests must also specify a User-Agent header. The value of this header should either be the type of client, such as "NodeJS" or "Python," or the name of the customer's application.

Before you authenticate to the API, you need an API subscription and an API application. See Subscriptions.

Basic authentication

The API accepts HTTP basic authentication (also known as basic authentication) for some endpoints that do not access specific customer information. Follow these steps to use basic authentication:

curl -X GET --user 123abc456def:1a2b3c4d \
"https://api.shutterstock.com/v2/images/search" \
  -G \
  --data-urlencode "query=sunrise"
export SHUTTERSTOCK_KEY="123abc456def"
export SHUTTERSTOCK_SECRET="1a2b3c4d"

shutterstock images search-images --query=sunrise
$queryFields = [
  "query" => "sunrise"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
  CURLOPT_USERPWD => "123abc456def:1a2b3c4d",
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

const applicationClientId = "123abc456def";
const applicationClientSecret = "1a2b3c4d";
sstk.setBasicAuth(applicationClientId, applicationClientSecret);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "query": "kites",
  "image_type": ["photo"],
  "page": 1,
  "per_page": 5,
  "sort": "popular",
  "view": "minimal",
};

imagesApi.searchImages(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
  1. Create an account at https://www.shutterstock.com if you don't already have one.
  2. Set up an application at https://www.shutterstock.com/account/developers/apps and get the consumer key and consumer secret from the application.
  3. Pass the consumer key and consumer secret to the API along with the request. For example, you can use basic authentication to search for images by using the GET /v2/images/search endpoint. The example in the right-hand pane passes the ID and secret (in this case, 123abc456def and 1a2b3c4d) in place of a user name and password.

API endpoints that require an OAuth scope do not accept basic authentication. To use these endpoints, you must use OAuth authentication.

OAuth authentication

Most endpoints require OAuth 2.0 authentication. In this type of authentication, you use an application and an individual user's login credentials to obtain a token. Then you can use that token as credentials for API requests in place of a user name and password.

Some endpoints require one or more scopes, or permissions, which let the user control what the application can do with the token. For example, to edit a user's collections, the token must include the collections.edit scope. Applications can request multiple tokens with different scopes or a single token with multiple scopes.

Getting tokens from your account page

As a shortcut, you can get a token directly from an application on your account page:

  1. Create an account at https://www.shutterstock.com if you don't already have one.
  2. Set up an application at https://www.shutterstock.com/account/developers/apps.
  3. On the application details page, under Token, click Generate token.
  4. On the Select scopes page, select the scopes for the token. The token automatically has scopes that allow it to run basic tasks. You can add scopes that allow it to access your licenses and collections.
  5. Click Continue.
  6. In the popup window, sign in to your shutterstock.com account.

The popup window shows the token. Copy it immediately, because it is shown only once. The token is valid until the user account that you logged in with changes its password or email address.

Keep this token private, because other people could use it to access the account's subscriptions and media.

Now you can use the token to authenticate to the API. See Authenticating with OAuth tokens.

Getting tokens from application code

Get a temporary authentication code

curl -X GET "https://api.shutterstock.com/v2/oauth/authorize" \
  -G \
  --data-urlencode "scope=licenses.create licenses.view purchases.view" \
  --data-urlencode "state=demo_`date +%s`" \
  --data-urlencode "response_type=code" \
  --data-urlencode "redirect_uri=http://localhost:3000/callback" \
  --data-urlencode "client_id=$CLIENT_ID"
curl -X GET "https://api.shutterstock.com/v2/oauth/authorize" \
  -G \
  --data-urlencode "scope=licenses.create licenses.view purchases.view" \
  --data-urlencode "state=demo_`date +%s`" \
  --data-urlencode "response_type=code" \
  --data-urlencode "redirect_uri=http://localhost:3000/callback" \
  --data-urlencode "client_id=$CLIENT_ID"
$queryFields = [
  "scope" => "licenses.create,licenses.view,purchases.view",
  "state" => "demo_" . microtime(true),
  "response_type" => "code",
  "redirect_uri" => "http://localhost:3000/callback",
  "client_id" => "$clientId"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/oauth/authorize?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const axios = require("axios");

axios.get("https://api.shutterstock.com/v2/oauth/authorize", {
  "params": {
    "scope": "licenses.create licenses.view purchases.view",
    "state": "demo_" + Math.round(new Date() / 1000),
    "response_type": "code",
    "redirect_uri": "http://localhost:3000/callback",
    "client_id": clientId
  },
  // Don't follow the redirect because this program is not running in a browser
  "maxRedirects": 0,
})
  .catch(({ response }) => {
    // HTTP 302: Redirect
    console.log(response.data);
  });
  1. Create an account at https://www.shutterstock.com if you don't already have one.

  2. Set up an application at https://www.shutterstock.com/developers and get the consumer key and consumer secret from the application.

  3. Give the application a callback host name. If you've got an application running on a server, use the host name of the server. Otherwise, leave the default host name localhost for testing purposes.

  4. Pass your consumer key to the GET /v2/oauth/authorize endpoint to get a temporary authentication code. See the right-hand pane for an example.

    Use these parameters:

    • client_id: The consumer key from your application on https://www.shutterstock.com/developers.
    • redirect_uri: The callback URI for your application. This callback URI must use a host name that you set up in your application. (Again, for testing purposes, you can use "localhost," as in http://localhost:3000/callback.)
    • response_type: Specify code to receive a temporary authentication code that you can use to get an access token.
    • scope: A space-separated list of scopes (or permissions) for the token. See OAuth scopes.
    • state: A value that the endpoint passes back to your application so you can include other information or verify that the request worked.

    The endpoint returns a 302 return code and a URL. Here's an example:

    Moved Temporarily. Redirecting to https://accounts.shutterstock.com/login?next=%2Foauth%2Fauthorize%3Fscope%3Dlicenses.create%20licenses.view%20purchases.view%26state%3Ddemo_1498496256%26response_type%3Dcode%26redirect_uri%3Dhttp%3A%2F%2Flocalhost%3A3000%2Fcallback%26client_id%3DCLIENT_ID%26realm%3Dcustomer

  5. Open the URL in a web browser, log in, and allow your Shutterstock account to access the callback host name. The Permission Request window lets you make sure that you want to let programs with the token access your Shutterstock account with the specific permissions: The Permission Request window, showing the scopes that your application will have by using the token

    When you click Allow, the Shutterstock API redirects your web browser to the callback URL with information in the parameters. If you don't have a full application set up yet, the browser gives an error because the web page isn't available, but that's OK because for now, all you need is the URL. Here's an example:

    http://localhost:3000/callback?code=ABC123&state=demo_1498496256

    For testing the API, copy the authentication code from the URL (in the previous example, it's ABC123) and use it in the next step. When you're ready to code a complete application, you can set it up to embed or refer to the login web page, accept the request from this URL, and store the information from the URL parameters. This code can be used only once, and it expires after 5 minutes.

  6. Finally, authenticate to the API and get an access token. To request a token that does not expire, specify expires=false or omit the expires parameter. To request a token that expires after one hour and then can be refreshed, specify expires=true.

Use the authentication code to get a token

curl -X POST "https://api.shutterstock.com/v2/oauth/access_token" \
  --data-urlencode "client_id=$CLIENT_ID" \
  --data-urlencode "client_secret=$CLIENT_SECRET" \
  --data-urlencode "grant_type=authorization_code" \
  --data-urlencode "expires=false" \
  --data-urlencode "code=$CODE"
curl -X POST "https://api.shutterstock.com/v2/oauth/access_token" \
  --data-urlencode "client_id=$CLIENT_ID" \
  --data-urlencode "client_secret=$CLIENT_SECRET" \
  --data-urlencode "grant_type=authorization_code" \
  --data-urlencode "expires=false" \
  --data-urlencode "code=$CODE"
$body = [
  "client_id" => $clientId,
  "client_secret" => $clientSecret,
  "grant_type" => "authorization_code",
  "expires" => false,
  "code" => $code
];
$encodedBody = json_encode($body);
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/oauth/access_token",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];
$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);
$decodedResponse = json_decode($response);
print_r($decodedResponse);
const axios = require("axios");

const body = {
  "client_id": clientId,
  "client_secret": clientSecret,
  "grant_type": "authorization_code",
  "expires": false,
  "code": code
};

axios.post("https://api.shutterstock.com/v2/oauth/access_token", body)
  .then((res) => {
    console.log(res);
  });

Use the POST /v2/oauth/access_token endpoint, as in the example in the right-hand pane. The parameters for this endpoint include the application's consumer key, consumer secret, and the code you got from the URL in the previous step.

This endpoint returns the access token in a JSON response. If you requested a token that does not expire, the API returns an access token that starts with v2/, as in this example:

{"access_token":"v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a","token_type":"Bearer"}

If you requested a token that expires, the API returns an access token that starts with 1/ and a refresh token, as in this example. You will need the refresh token to refresh the access token later.

{"access_token":"1/eyJjbGllbnRfaWQiOiJjNDc4Yi0yNjYzMC1","expires_in":3600,"token_type":"Bearer","user_token":"eyJhbGciOiTtcXy71dhyfjBVU","refresh_token":"3/d_0F6_AmGRO5a7NNhjdCwobDudbdvDNdPQTWV1IovpWPgWy"}

Authenticating with OAuth tokens

Search for images

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a" \
  -G \
  --data-urlencode "query=kites" \
  --data-urlencode "image_type=photo" \
  --data-urlencode "page=1" \
  --data-urlencode "per_page=5" \
  --data-urlencode "sort=popular" \
  --data-urlencode "view=minimal"
$queryFields = [
  "query" => "kites",
  "image_type" => "photo",
  "page" => 1,
  "per_page" => 5,
  "sort" => "popular",
  "view" => "minimal"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken("Bearer v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a");

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "query": "kites",
  "image_type": ["photo"],
  "page": 1,
  "per_page": 5,
  "sort": "popular",
  "view": "minimal"
};

imagesApi.searchImages(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query kites \
  --image-type photo \
  --page 1 \
  --per-page 5 \
  --sort popular \
  --view minimal

Now you can use the token to access the API by passing it as an authorization header, as in the example of searching for images to the right. Further examples in this documentation assume that you put the token in the SHUTTERSTOCK_API_TOKEN environment variable, but you can also store the token in a variable in your code. Specifically, the cURL and Node.js examples are designed to use the environment variable and PHP assumes that the token is in the code. The CLI requires that you put the token in the SHUTTERSTOCK_API_TOKEN environment variable.

Keep this token private, because other people could use it to access the account's subscriptions and media.

You can use the same application to get tokens for any number of users. Just repeat the request to the GET /v2/oauth/authorize endpoint with the application information and then sign in as a different user. Each token is tied to the user's account.

For more information about these endpoints, see OAuth.

Refreshing tokens

Refreshing a token

curl -X POST "https://api.shutterstock.com/v2/oauth/access_token" \
  --data-urlencode "client_id=$CLIENT_ID" \
  --data-urlencode "client_secret=$CLIENT_SECRET"
  --data-urlencode "grant_type=refresh_token" \
  --data-urlencode "refresh_token=$REFRESH_TOKEN" \
$body = [
  "client_id" => $clientId,
  "client_secret" => $clientSecret,
  "grant_type" => "refresh_token",
  "refresh_token" => $refreshToken
];
$encodedBody = http_build_query($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/oauth/access_token",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const axios = require("axios");

const body = {
  "client_id": clientId,
  "client_secret": clientSecret,
  "grant_type": "refresh_token",
  "refresh_token": refreshToken,
};

axios.post("https://api.shutterstock.com/v2/oauth/access_token", body)
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.error(err);
  });
curl -X POST "https://api.shutterstock.com/v2/oauth/access_token" \
  --data-urlencode "client_id=$CLIENT_ID" \
  --data-urlencode "client_secret=$CLIENT_SECRET"
  --data-urlencode "grant_type=refresh_token" \
  --data-urlencode "refresh_token=$REFRESH_TOKEN" \

If you requested a token with the parameter expires=true, the token begins with "1/", and it expires in one hour. You can refresh the token to continue using it.

If you requested a token that does not expire, the token does not need to be refreshed. This type of token is valid until the user account that is associated with the token changes its password or email address.

To refresh a token that expires, pass the refresh token, which begins with "3/", to the POST /v2/oauth/access_token endpoint. You must also pass either the consumer secret from the application or the user ID of the user account that is associated with the token. Use these parameters:

The response includes the existing refresh token and a new token that is valid for one hour.

OAuth scopes

Most endpoints require an access token with one or more scopes, or permissions. You can see the scopes that an individual endpoint requires in the endpoint reference.

The following table shows the available scopes.

Scope Description
No scope Grants the user.view scope by default
collections.edit Grants the ability to create collections, edit collections, and modify the contents of collections
collections.view Grants read-only access to collections and their contents
licenses.create Grants the ability to download and license media on behalf of the user
licenses.view Grants read-only access to a user's licenses
purchases.view Grants read-only access to a user's purchase history
user.view Grants read-only access to a user's basic account information (including the user name, id, and first and last name)

Searching for media

Simple image keyword search

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=kites"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query kites
$queryFields = [
  "query" => "kites"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "query": "kites"
};

imagesApi.searchImages(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Simple video keyword search

curl -X GET "https://api.shutterstock.com/v2/videos/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=hot air balloon"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos search-videos \
  --query "hot air balloon"
$queryFields = [
  "query" => "hot air balloon"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "query": "hot air balloon"
};

videosApi.searchVideos(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Simple audio keyword search

curl -X GET "https://api.shutterstock.com/v2/audio/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=bluegrass"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio search-tracks \
  --query bluegrass
$queryFields = [
  "query" => "bluegrass"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const queryParams = {
  "query": "bluegrass"
};

audioApi.searchTracks(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

To search with a keyword, pass the search keywords to the appropriate endpoint:

The search keywords must be URL encoded and in the query query parameter. The API searches for the keywords in all textual fields, including but not limited to the description, keywords, and title. See the right-hand pane for examples of simple image, video, and audio search requests.

Searches do not support wildcards such as *.

For examples of search results, see Results.

Some API subscriptions return a limited set of results. See Subscriptions.

Search endpoints require basic or OAuth authentication. See Authentication.

Conditional searches

Searches with conditional operators

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=dog AND cat"

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=mountain NOT camping"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query "dog AND cat"

shutterstock images search-images \
  --query "mountain NOT camping"
$inclusionQueryFields = [
  "query" => "dog AND cat"
];

$inclusionOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($inclusionQueryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$inclusionHandle = curl_init();
curl_setopt_array($inclusionHandle, $inclusionOptions);
$inclusionResponse = curl_exec($inclusionHandle);
curl_close($inclusionHandle);

$inclusionDecodedResponse = json_decode($inclusionResponse);
print_r($inclusionDecodedResponse);


$exclusionQueryFields = [
  "query" => "mountain NOT camping"
];

$exclusionOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($exclusionQueryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$exclusionHandle = curl_init();
curl_setopt_array($exclusionHandle, $exclusionOptions);
$exclusionResponse = curl_exec($exclusionHandle);
curl_close($exclusionHandle);

$exclusionDecodedResponse = json_decode($exclusionResponse);
print_r($exclusionDecodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams1 = {
  "query": "dog AND cat"
};

imagesApi.searchImages(queryParams1)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

const queryParams2 = {
  "query": "mountain NOT camping"
};

imagesApi.searchImages(queryParams2)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Searches for images and videos can use AND, OR, and NOT conditions, but searches for audio do not support these keywords.

To use AND, OR, or NOT in searches, you include these operators in the query query parameter. The operators must be in upper case and they must be in English, regardless of the language the keywords are in.

You can group conditional search terms with parentheses. For example, to search for images with either dogs or cats, but not both, use (dog NOT cat) OR (cat NOT dog).

Bulk searches

Running multiple searches

DATA='[
  {
    "query": "cat",
    "license": ["editorial"],
    "sort": "popular"
  },
  {
    "query": "dog",
    "orientation": "horizontal"
  }
]'

curl -X POST "https://api.shutterstock.com/v2/bulk_search/images" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H 'Content-Type: application/json' \
  -d "$DATA"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '[
  {
    "query": "cat",
    "license": ["editorial"],
    "sort": "popular"
  },
  {
    "query": "dog",
    "orientation": "horizontal"
  }
]' > data.json

shutterstock bulk-search bulk-search-images data.json
$body = [
  [
    "query" => "cat",
    "license" => ["editorial"],
    "sort" => "popular"
  ],
  [
    "query" => "dog",
    "orientation" => "horizontal"
  ]
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/bulk_search/images",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const bulkSearchApi = new sstk.BulkSearchApi();

const body = [
  {
    "query": "cat",
    "license": ["editorial"],
    "sort": "popular"
  },
  {
    "query": "dog",
    "orientation": "horizontal"
  }
];

bulkSearchApi.bulkSearchImages(body);

You can run up to 5 image searches in a single request with the POST /v2/bulk_search/images endpoint. The API returns a maximum of 20 results for each search. To use this endpoint, pass multiple searches in an array in the request body. Each search in the array has the same parameters as an individual image search.

You can also pass query parameters in the request. These parameters become defaults for each search, but the parameters in the individual searches override them.

Sorting results

Sorting search results

curl -X GET "https://api.shutterstock.com/v2/videos/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=boats" \
  --data-urlencode "sort=popular"


curl -X GET "https://api.shutterstock.com/v2/audio/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "instruments=Piano" \
  --data-urlencode "duration_from=300"
  --data-urlencode "sort=bpm" \
  --data-urlencode "sort_order=desc"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos search-videos \
  --query boats \
  --sort popular

shutterstock audio search-tracks \
  --instruments Piano \
  --duration-from 300 \
  --sort bpm \
  --sort-order desc
$videoQueryFields = [
  "query" => "boats",
  "sort" => "popular"
];

$videoOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/vidoes/search?" . http_build_query($videoQueryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$videoHandle = curl_init();
curl_setopt_array($videoHandle, $videoOptions);
$videoResponse = curl_exec($videoHandle);
curl_close($videoHandle);

$videoDecodedResponse = json_decode($videoResponse);
print_r($videoDecodedResponse);


$audioQueryFields = [
  "query" => "Piano",
  "duration_from" => 300,
  "sort" => "bpm",
  "sort_order" => "desc"
];

$audioOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/search?" . http_build_query($audioQueryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$audioHandle = curl_init();
curl_setopt_array($audioHandle, $audioOptions);
$audioResponse = curl_exec($audioHandle);
curl_close($audioHandle);

$audioDecodedResponse = json_decode($audioResponse);
print_r($audioDecodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videoApi = new sstk.VideosApi();

const videoQueryParams = {
  "query": "boats",
  "sort": "popular"
};

videoApi.searchVideos(videoQueryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

const audioApi = new sstk.AudioApi();

const audioQueryParams = {
  "query": "Piano",
  "duration_from": 300,
  "sort": "bpm",
  "sort_order": "desc"
};

audioApi.searchTracks(audioQueryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

The sort parameter controls how results are ordered. By default, image and video searches return the most popular media first. Audio searches without the sort parameter return tracks based on the popularity of that track in the location of the request.

The image and video search endpoints can order results in the following ways:

The audio search endpoint can sort results in the following ways:

For audio only, you can use the sort_order parameter return results in ascending ("asc") or descending ("desc," the default) order.

Localizing searches

You can localize searches and their results by setting the language or region for the search.

Search languages

Searching in other languages

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=chien" \
  --data-urlencode "language=fr" \
  --data-urlencode "region=fr"

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=perro" \
  --data-urlencode "language=es" \
  --data-urlencode "region=es"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query chien \
  --language fr \
  --region fr

shutterstock images search-images \
  --query perro \
  --language es \
  --region es
$frenchQueryFields = [
  "query" => "chien",
  "language" => "fr",
  "region" => "fr"
];

$frenchOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($frenchQueryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$frenchHandle = curl_init();
curl_setopt_array($frenchHandle, $frenchOptions);
$frenchResponse = curl_exec($frenchHandle);
curl_close($frenchHandle);

$frenchDecodedResponse = json_decode($frenchResponse);
print_r($frenchDecodedResponse);


$spanishQueryFields = [
  "query" => "perro",
  "language" => "es",
  "region" => "es"
];

$spanishOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($spanishQueryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$spanishHandle = curl_init();
curl_setopt_array($spanishHandle, $spanishOptions);
$spanishResponse = curl_exec($spanishHandle);
curl_close($spanishHandle);

$spanishDecodedResponse = json_decode($spanishResponse);
print_r($spanishDecodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParamsFR = {
  "query": "chien",
  "language": "fr",
  "region": "fr"
};

imagesApi.searchImages(queryParamsFR)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

const queryParamsES = {
  "query": "perro",
  "language": "es",
  "region": "es"
};

imagesApi.searchImages(queryParamsES)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

You can provide search keywords in languages other than English by specifying the language code (such as fr or zh-Hant) in the language query parameter or the Accept-Language header. If you set this parameter or header, you can also pass category names in that language. The response includes categories and keywords in that language. For the list of languages that the API accepts, see the Language schema.

Geo-ranking results

You can customize image search results based on location with the region parameter. This parameter accepts any ISO 3166-1 alpha-2 country code. You can also specify an IP address in this parameter and the API infers a country code from it.

Based on the location, the API changes rankings to provide more appropriate results. For example, searches for the term "football" return images of different sports depending on the location. Search results are raised or lowered in relevance based on how well they relate to the location.

You can also filter results by the country that the contributor lives in with the contributor_country parameter. For example, to show images from contributors in France, set the contributor_country parameter to FR. To hide images from contributors in Germany, set the contributor_country parameter to NOT DE. To filter multiple countries, send the parameter multiple times with each country code. You can use this parameter with NOT or without NOT, but not with both in the same search.

Search parameters

Searching with parameters

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=earthquake" \
  --data-urlencode "sort=newest" \
  --data-urlencode "image_type=photo"


curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "sort=popular" \
  --data-urlencode "category=Holidays"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query earthquake \
  --sort newest \
  --image-type photo

shutterstock images search-images \
  --category Holidays \
  --sort popular
$newestQueryFields = [
  "query" => "earthquake",
  "sort" => "newest",
  "image_type" => "photo"
];

$newestOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($newestQueryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$newestHandle = curl_init();
curl_setopt_array($newestHandle, $newestOptions);
$newestResponse = curl_exec($newestHandle);
curl_close($newestHandle);

$newestDecodedResponse = json_decode($newestResponse);
print_r($newestDecodedResponse);


$popularQueryFields = [
  "sort" => "popular",
  "category" => "Holidays"
];

$popularOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($popularQueryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$popularHandle = curl_init();
curl_setopt_array($popularHandle, $popularOptions);
$popularResponse = curl_exec($popularHandle);
curl_close($popularHandle);

$popularDecodedResponse = json_decode($popularResponse);
print_r($popularDecodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams1 = {
  "query": "earthquake",
  "sort": "newest",
  "image_type": ["photo"]
};

api.searchImages(queryParams1)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

const queryParams2 = {
  "sort": "popular",
  "category": "Holidays"
};

imagesApi.searchImages(queryParams2)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Using parameters multiple times

curl -X GET "https://api.shutterstock.com/v2/audio/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "instruments=Trumpet" \
  --data-urlencode "instruments=Drums"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio search-tracks \
  --instruments Piano \
  --instruments Drums
$query = "instruments=Trumpet&instruments=Drums";

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/search?$query",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const queryParams = {
  "instruments": ["Trumpet", "Drums"]
};

audioApi.searchTracks(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Aside from the keywords in the query field, search requests can include many other search fields.

Some parameters can accept more than one value. In this case, you can specify the same parameter more than one time, as in the examples in the right-hand pane.

For a complete list of these search parameters, see the API documentation for the search endpoints:

Aspect ratios

To search for images by aspect ratio, specify the ratio as a positive decimal of the width divided by the height. For example, to search for images with a 4:3 aspect ratio, set the aspect_ratio parameter to 1.3333. The search endpoints calculate aspect ratio to four decimal places and return only images that exactly match this decimal aspect ratio.

Images with a higher aspect ratio are wider and images with a lower aspect ratio are narrower. Images with a landscape orientation have aspect ratios greater than 1 and images with a portrait orientation have aspect ratios less than or equal to 1, such as 0.75 for an image with a 3:4 aspect ratio.

Images do not always exactly match a standard ratio. Because of a difference of a few pixels, images that have a ratio of approximately 3:2 can have decimal aspect ratios of 1.4998, 1.5, or 1.5001. To search for images that have an aspect ratio of approximately 1.5, set the aspect_ratio_max parameter to 1.5005 and the aspect_ratio_min parameter to 1.4995.

To search for videos by aspect ratio, set the aspect_ratio parameter to a preset value such as 4_3 or 16_9. The search returns videos that have approximately that aspect ratio.

Sub-parameters

Searching with sub-parameters

curl -X GET "https://api.shutterstock.com/v2/audio/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "genre=Blues > Chicago"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio search-tracks \
  --genre "Blues > Chicago"
$query = "genre=Blues > Chicago";

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/search?$query",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const queryParams = {
  "genre": ["Blues > Chicago"]
};

audioApi.searchTracks(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

The audio search parameters genre and moods have main genres and moods and sub-genres and sub-moods. For example, you can use the search parameter genre=Blues for all blues tracks, or you can use the parameter genre=Blues > Chicago for Chicago-style blues tracks. Similarly, you can use the parameter moods=Wedding for all wedding tracks, or you can specify the parameters moods=Wedding > Classical or moods=Wedding > Modern for classical or modern wedding tracks.

By default, the API hides media that may not be appropriate for all audiences. The API provides two parameters that you can use to enable this content in the responses of some endpoints:

To disable either type of restriction, set one or both of these parameters to false. The image and video search endpoints support both parameters. The recommended images and similar images and videos endpoints support only the safe parameter.

Upload base 64-encoded reference image and get similar images

RESPONSE=$(curl -X POST "https://api.shutterstock.com/v2/cv/images" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
-d "{\"base64_image\":\"`base64 myImage.jpg | tr -d '\n'`\"}")

echo "The next step requires the jq program."

UPLOAD_ID=$(jq -r .upload_id <<< $RESPONSE)

curl -X GET "https://api.shutterstock.com/v2/cv/similar/images" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "asset_id=$UPLOAD_ID"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo "{\"base64_image\":\"`base64 myImage.jpg | tr -d '\n'`\"}" > data.json

RESPONSE=$(sstk cv upload-image data.json)

echo "The next step requires the jq program."

UPLOAD_ID=$(jq -r .upload_id <<< $RESPONSE)

shutterstock cv get-similar-images \
  --asset-id $UPLOAD_ID
$imageData = file_get_contents("myImage.jpg");
$encodedImageData = base64_encode($imageData);

$uploadBody = [
  "base64_image" => $encodedImageData
];
$uploadEncodedBody = json_encode($uploadBody);

$uploadOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/images",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $uploadEncodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $uploadOptions);
$uploadResponse = curl_exec($handle);
curl_close($handle);

$uploadDecodedResponse = json_decode($uploadResponse);
print_r($uploadDecodedResponse->upload_id);

$similarQuery = [
  "asset_id" => $uploadDecodedResponse->upload_id,
];

$similarOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/similar/images?" . http_build_query($similarQuery),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $similarOptions);
$similarResponse = curl_exec($handle);
curl_close($handle);

print_r($similarResponse);
const sstk = require("shutterstock-api");
const fs = require("fs");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const computerVisionApi = new sstk.ComputerVisionApi();

const imageFile = fs.readFileSync("./myImage.jpg");
const base64File = Buffer.from(imageFile).toString("base64");

const body = new sstk.ImageCreateRequest(base64File);

computerVisionApi.uploadImage(body)
  .then((data) => {
    console.log(data.upload_id);
    return computerVisionApi.getSimilarImages(data.upload_id);
  })
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Computer vision provides images and videos that are similar to a reference image that you supply.

To upload an image for reverse image and video search or keyword suggestions with computer vision, use the POST /v2/cv/images endpoint. Then, use the upload ID that this endpoint returns to get similar images or videos from the GET /v2/cv/similar/images or GET /v2/cv/similar/videos endpoints. The API returns up to 200 images or videos that appear visually similar to your image.

Images must be in JPG or PNG format and base64-encoded. They can be no larger than 10MB and can be no larger than 10,000 pixels in width or height. Some operating systems have a limit on the size of the parameters that you can send in a command-line request, such as with the curl program. If you see an error such as "Argument list too long," send a smaller image or make the request with a programming language such as PHP or Node.JS.

To use the computer vision endpoints, your application must be enabled for computer vision. Contact us for access.

Computer vision keyword suggestions

Upload base 64-encoded reference image and get suggested keywords

RESPONSE=$(curl -X POST "https://api.shutterstock.com/v2/cv/images" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"base64_image\":\"`base64 myImage.jpg | tr -d '\n'`\"}")

echo "The next step requires the jq program."

UPLOAD_ID=$(jq -r .upload_id <<< $RESPONSE)

curl -X GET "https://api.shutterstock.com/v2/cv/keywords" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "asset_id=$UPLOAD_ID"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo "{\"base64_image\":\"`base64 myImage.jpg`\"}" > data.json

RESPONSE=$(sstk cv upload-image data.json)

echo "The next step requires the jq program."

UPLOAD_ID=$(jq -r .upload_id <<< $RESPONSE)

shutterstock cv get-keywords \
  --asset-id $UPLOAD_ID
$imageData = file_get_contents("myImage.jpg");
$encodedImageData = base64_encode($imageData);

$uploadBody = [
  "base64_image" => $encodedImageData
];
$uploadEncodedBody = json_encode($uploadBody);

$uploadOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/images",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $uploadEncodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $uploadOptions);
$uploadResponse = curl_exec($handle);
curl_close($handle);

$uploadDecodedResponse = json_decode($uploadResponse);
print_r($uploadDecodedResponse->upload_id);

$keywordsQuery = [
  "asset_id" => $uploadDecodedResponse->upload_id,
];

$keywordsOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/keywords?" . http_build_query($keywordsQuery),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $keywordsOptions);
$keywordsResponse = curl_exec($handle);
curl_close($handle);

print_r($keywordsResponse);
const sstk = require("shutterstock-api");
const fs = require("fs");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const computerVisionApi = new sstk.ComputerVisionApi();

const imageFile = fs.readFileSync("./myImage.jpg");
const base64File = Buffer.from(imageFile).toString("base64");

const body = new sstk.ImageCreateRequest(base64File);

computerVisionApi.uploadImage(body)
  .then((data) => {
    console.log(data.upload_id);
    return computerVisionApi.getKeywords(data.upload_id);
  })
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Computer vision can also provide suggested keywords for an image.

To get suggested keywords for an image, upload a base64-encoded image to the POST /v2/cv/images endpoint as with reverse image search. Then, use the upload ID that this endpoint returns to get suggested keywords from the GET /v2/cv/keywords endpoint. You can also use the ID of an existing image in the Shutterstock collection. In this case, the suggested keywords may not be the same as the keywords in the image metadata.

To get suggested search keywords from a block of plain text, use the POST /v2/images/search/suggestions endpoint. Then you can use those keywords to search for media items that are related to the text.

Use AI search to find images that promote awareness in the finance industry

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=travel" \
  --data-urlencode "ai_search=true" \
  --data-urlencode "ai_objective=awareness" \
  --data-urlencode "ai_industry=finance"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query "travel" \
  --ai_search true \
  --ai_objective "awareness" \
  --ai_industry "finance"
$queryFields = [
  "query" => "travel",
  "ai_search" => "true",
  "ai_objective" => "awareness",
  "ai_industry" => "finance"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "query": "travel",
  "ai_search": true,
  "ai_objective": "awareness",
  "ai_industry": "finance",
};

imagesApi.searchImages(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Shutterstock.AI predicts which assets will perform best based on what you're trying to achieve. You pass a goal for the media, which includes a target industry and an objective, and the AI returns images that best satisfy this goal.

To use AI insights, pass only these parameters to the GET /v2/image/search endpoint:

AI search accepts the same filter parameters as the normal search endpoint except pagination parameters like page. The whole list of parameters can be found here

The API uses Shutterstock Predict to determine which assets will accomplish the specified objective for the specified audience. The response from the API sorts images based on how well they satisfy the objective for the target industry.

Example AI search response (truncated)

{
  "page": 1,
  "per_page": 20,
  "total_count": 12345678,
  "data": [
    {
      "id": 87654321,
      "description": "An image of a car, a person, and a dog",
      "assets": {...},
      "insights": {
        "labels": [
          "Automobile",
          "Dog",
          "Person"
        ]
      }
    },
    {
      "id": 98765432,
      "description": "An image of a car with a driver and no dog",
      "assets": {...},
      "insights": {
        "labels": [
          "Automobile",
          "Person"
        ]
      }
    }
  ],
  "insights": {
    "label_performance": [
      {
        "name": "Automobile",
        "percentile_performance": 98.7
      },
      {
        "name": "Person",
        "percentile_performance": 96.8
      },
      {
        "name": "Dog",
        "percentile_performance": 92.3
      },
      {
        ...
      }
    ]
  }
}

To help explain how it ordered the images, the AI lists features that are visible in the images, such as "Person" and "Automobile." It also shows how well images with those features perform for the specified goal compared to other images. Analyzing these features is part of how the AI determines which images satisfy the goal. The features are listed only in English.

The top-level insights object shows the top features that the AI thinks perform best for the specified industry and objective. The percentile_performance field shows how well images with a certain feature perform compared to images without the feature. These percentages depend on the audience and industry in the request, so if you use different audiences or industries, the API returns different features and percentages. These features are not the same as the categories that the API uses to classify images via GET /v2/images/categories.

For example, the truncated response in the right-hand column shows that images with the "Automobile" label perform better than 98.7% of all other images for the goal specified in the request. These percentages may change as the AI learns over time.

Each image in the response has a labels array that lists the features that the AI sees in the image. This array includes only the labels that are in the insights.label_performance array, not every label that the AI sees in the image.

To use the AI search, your application must be enabled for AI search. Contact us for access.

Results

Example image search results

{
  "page": 1,
  "per_page": 1,
  "total_count": 6471766,
  "search_id": "BogDL7hW4kdptwSXvWsE3w",
  "data": [
    {
      "id": "755022088",
      "aspect": 1.5,
      "assets": {
        "preview": {
          "height": 300,
          "url": "https://image.shutterstock.com/display_pic_with_logo/2723875/755022088/stock-photo-aerial-view-to-ocean-waves-blue-water-background-755022088.jpg",
          "width": 450
        },
        "small_thumb": {
          "height": 67,
          "url": "https://thumb9.shutterstock.com/thumb_small/2723875/755022088/stock-photo-aerial-view-to-ocean-waves-blue-water-background-755022088.jpg",
          "width": 100
        },
        "large_thumb": {
          "height": 100,
          "url": "https://thumb9.shutterstock.com/thumb_large/2723875/755022088/stock-photo-aerial-view-to-ocean-waves-blue-water-background-755022088.jpg",
          "width": 150
        },
        "mosaic": {
          "url": "https://thumb9.shutterstock.com/image-photo/redirected-250nw-755022088.jpg",
          "width": 250,
          "height": 167
        },
        "huge_thumb": {
          "height": 260,
          "url": "https://image.shutterstock.com/image-photo/aerial-view-ocean-waves-blue-260nw-755022088.jpg",
          "width": 390
        },
        "preview_1000": {
          "url": "https://ak.picdn.net/shutterstock/photos/755022088/watermark_1000/4aa68fbdca3b3c6b9792a555c7b793e9/preview_1000-755022088.jpg",
          "width": 1000,
          "height": 667
        },
        "preview_1500": {
          "url": "https://image.shutterstock.com/z/stock-photo-aerial-view-to-ocean-waves-blue-water-background-755022088.jpg",
          "width": 1500,
          "height": 1000
        }
      },
      "contributor": {
        "id": "2723875"
      },
      "description": "Aerial view to ocean waves. Blue water background",
      "image_type": "photo",
      "media_type": "image"
    }
  ],
  "spellcheck_info": {}
}

Example video search results

{
  "page": 1,
  "per_page": 1,
  "total_count": 323254,
  "search_id": "Kz8nE1uZ8f9SVZiC41DbPQ",
  "data": [
    {
      "media_type": "video",
      "id": "32074804",
      "description": "Large container ship at sea - Top down Aerial ",
      "aspect": 1.778,
      "duration": 39,
      "contributor": {
        "id": "474853"
      },
      "aspect_ratio": "16:9",
      "assets": {
        "thumb_webm": {
          "url": "https://ak4.picdn.net/shutterstock/videos/32074804/thumb/stock-footage-large-container-ship-at-sea-top-down-aerial.webm"
        },
        "thumb_mp4": {
          "url": "https://ak4.picdn.net/shutterstock/videos/32074804/thumb/stock-footage-large-container-ship-at-sea-top-down-aerial.mp4"
        },
        "preview_webm": {
          "url": "https://ak4.picdn.net/shutterstock/videos/32074804/preview/stock-footage-large-container-ship-at-sea-top-down-aerial.webm"
        },
        "preview_mp4": {
          "url": "https://ak4.picdn.net/shutterstock/videos/32074804/preview/stock-footage-large-container-ship-at-sea-top-down-aerial.mp4"
        },
        "thumb_jpg": {
          "url": "https://ak4.picdn.net/shutterstock/videos/32074804/thumb/1.jpg"
        },
        "preview_jpg": {
          "url": "https://ak4.picdn.net/shutterstock/videos/32074804/thumb/1.jpg"
        }
      }
    }
  ]
}

Example audio search results

{
  "page": 1,
  "per_page": 1,
  "total_count": 107,
  "search_id": "d375d427-7ba3-4636-b00b-2fb48a0bf41e",
  "data": [
    {
      "id": "394445",
      "description": "Groovy and whimsical, playful marimba and island percussion create an atmosphere of winsome fun.",
      "assets": {
        "clean_audio": {
          "file_size": 29402944
        },
        "preview_mp3": {
          "file_size": 3676706,
          "url": "https://ak.picdn.net/shutterstock/audio/394445/preview/preview.mp3"
        },
        "preview_ogg": {
          "file_size": 3866129,
          "url": "https://ak.picdn.net/shutterstock/audio/394445/preview/preview.ogg"
        },
        "waveform": {
          "file_size": 19060,
          "url": "https://ak.picdn.net/shutterstock/audio/394445/waveform/waveform.png"
        }
      },
      "title": "Calypso Bird",
      "media_type": "audio",
      "contributor": {
        "id": "2847971"
      },
      "published_time": "2015-09-17T11:31:27-04:00",
      "added_date": "2015-09-17"
    }
  ]
}

The search results start with information about the search and the results, including the search ID, the total number of results, and the paging information. Not all results are returned at once; to page through the results, see Responses.

You can sort the search results by factors like the popularity of the media and how recently it was added. For more information about sorting, see Sorting results.

By default, the results show basic information about each search result, including its description, its contributor, information about its dimensions, aspect ratio, or length, and links to previews. You can get more details about each result by including the view=full parameter with the search. You can also filter fields out of the details with the fields parameter. For more information, see Responses.

Previewing media

To preview the media, use the URLs in the assets section of the search response. Each result includes one or more thumbnails and previews. Images include watermarked previews in different sizes, videos include thumbnail images and low-resolution watermarked preview videos, and audio tracks include versions with voice-overs. You can embed these previews on web pages or link to them.

To remove the sidebar and ID from preview images, see Removing the ID from preview versions of images.

The dimensions for thumbnail and preview images and videos depend on the aspect ratio of the original images and videos.

Image thumbnail and preview dimensions

Image search results and responses to the GET /v2/images/{id} endpoint include thumbnails and previews in multiple sizes. The response includes the dimensions of each image. Which sizes appear in your response depends on the type of your account.

The thumbnails and previews come with image IDs (also known as the "whitestrip") embedded on the images. The API response provides the dimensions of the image without the whitestrip. To show the image without the whitestrip, limit the display to the dimensions in the API response. For more information, see Removing the ID from preview versions of images.

Video thumbnail and preview dimensions

Thumbnails of videos with aspect ratios less than or equal to 16:9 are 180 pixels in height with an appropriate width for the aspect ratio. For example, 16:9 videos (such as 720p, 1080p, and 4K videos) have thumbnails that are 320x180 pixels, and 4:3 videos have thumbnails that are 238x180 pixels. Thumbnails of videos with aspect ratios greater than 16:9 have a height equal to 320 divided by the aspect ratio. For example, 1.9:1 videos have thumbnails that are 320x168. Video thumbnails are watermarked.

Previews of videos with aspect ratios less than or equal to 16:9 are 336 pixels in height with an appropriate width. For example, 16:9 videos have previews that are 596x336. Previews of videos with aspect ratios greater than 16:9 have a height equal to 600 divided by the aspect ratio. For example, 1.9:1 videos have previews that are 600x316. Preview videos are watermarked.

Licensing and downloading

Downloading media with the Shutterstock API has two main steps: First, you use a subscription to license one or more pieces of media. Then, you can use links in the response to download the media. Some subscriptions allow you to redownload the media later.

When you request a license with the API, it provides platform licenses for media. These platform licenses allow different uses of assets than the standard and enhanced licenses. For example, platform licenses can be used to resell media licenses or to use media in places such as applications, web sites, mobile apps, and social media. For details about what you can do with platform licenses, see Shutterstock API Terms of Service.

For information on licensing errors, see Errors.

Prerequisites

Look up your subscription IDs

curl -X GET "https://api.shutterstock.com/v2/user/subscriptions" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock user get-user-subscription-list
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/user/subscriptions",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const usersApi = new sstk.UsersApi();

usersApi.getUserSubscriptionList()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

If you are using an API subscription from https://www.shutterstock.com/developers, you can leave out the subscription ID field in your licensing request. In this case, the API uses the subscription that is linked to the account in the token. If that account has more than one API subscription, it uses the subscription that is closest to its expiration date.

To get your subscription ID, use the GET /v2/user/subscriptions endpoint, as in the example in the right-hand pane. The examples assume that your subscription ID is s12345678. You can put the subscription ID in the subscription_id field for each asset you are licensing, as in the examples below, or you can use the subscription_id query parameter to set the subscription ID for all of the assets.

Licensing media

License images

DATA='{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "price": 12.50,
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/images/licenses" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$DATA"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "price": 12.50,
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
}' > data.json

shutterstock images license-images \
  data.json
$body = [
  "images" => [
    [
      "image_id" => "539753938",
      "subscription_id" => "s12345678",
      "price"=> 12.50,
      "metadata"=> [
        "customer_id"=> "12345"
      ]
    ]
  ]
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/licenses",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const body = {
  "images": [
    {
      "image_id": "170076830",
      "subscription_id": "s12345678",
      "price": 12.50,
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
};

imagesApi.licenseImages(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Example response

{
  "data": [
    {
      "image_id": "59656357",
      "download": {
        "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.jpg"
      },
      "allotment_charge": 1
    }
  ]
}

To request a license and download media, pass the media ID and the subscription ID to the appropriate endpoint. For example, to license images, use the POST /v2/images/licenses endpoint, as in the example in the right-hand column. You can use the defaults for the size and format or specify values; the example specifies JPG images.

The request body must include the correct metadata for your subscription type. See Request metadata.

The response includes a download link for each media item. Download links are valid for 8 hours.

After that, to download the image again, you must request a new link by either licensing the image again or requesting a redownload link if the license type permits redownloads. See Redownloading media.

Licensing editorial media

The endpoint that you use to license editorial media depends on where you find the editorial media. Some editorial accounts license editorial media from the same endpoints as they use to access non-editorial media. Other accounts use separate editorial endpoints to find and license editorial media. Contact your account representative for information about how you should access editorial media.

Accessing editorial media from non-editorial endpoints

Example request body for licensing editorial media

(POST /v2/images/licenses)

{
  "images": [
    {
      "image_id": "494469670",
      "subscription_id": "s12345678",
      "editorial_acknowledgement": true
    }
  ]
}

If you access editorial media from non-editorial endpoints, you can find editorial media by searching with the GET /v2/images/search endpoint and setting the license parameter to editorial. Then use the POST /v2/images/licenses endpoint to license them as you would license non-editorial media.

Editorial images have the is_editorial field set to true. To license these images, you must acknowledge the editorial agreement as part of the licensing request. You must include "editorial_acknowledgement": true in the request, as in the example in the right-hand pane.

Accessing editorial media from editorial endpoints

Example request body for licensing editorial media

(POST /v2/editorial/images/licenses)

{
  "editorial": [
    {
      "editorial_id": "8594090h",
      "subscription_id": "s12345678",
      "license": "premier_editorial_comp"
    }
  ],
  "country": "USA"
}

If you access editorial media from separate editorial endpoints, use the GET /v2/editorial/images/search or GET /v2/editorial/videos/search endpoints to find the media. Use the POST /v2/editorial/images/licenses or POST /v2/editorial/videos/licenses endpoints to license and download the media, as shown in the example in the right-hand pane.

Downloading custom sizes

Setting the size of an image

DATA='{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "size": "custom",
      "custom_dimensions": {
        "width": 500
      }
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/images/licenses" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H 'Content-Type: application/json' \
  -d "$DATA"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "size": "custom",
      "custom_dimensions": {
        "width": 500
      }
    }
  ]
}' > data.json

shutterstock images license-images \
  data.json
$body = [
  "images" => [
    [
      "image_id" => "539753938",
      "subscription_id" => "s12345678",
      "size" => "custom",
      "custom_dimensions" => [
        "width" => 500
      ]
    ]
  ]
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/licenses",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const body = {
  "images": [
    {
      "image_id": "170076830",
      "subscription_id": "s12345678",
      "size": "custom",
      "custom_dimensions": {
        "width": 500
      }
    }
  ]
};

imagesApi.licenseImages(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

When you license and download an image, you can select one of the standard sizes that it is available in, or you can specify a custom height or width in pixels. The API resizes the image to match that height or width. You can set the height or the width but not both. The height or width must be at least 100 pixels and has a maximum of the original image size.

To resize images like this, your application must be enabled. Contact us for access.

Licensing sandbox

Test licensing with the licensing sandbox

DATA='{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "price": 12.50,
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
}'

curl -X POST "https://api-sandbox.shutterstock.com/v2/images/licenses" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$DATA"

RESPONSE=$(curl -X GET "https://api-sandbox.shutterstock.com/v2/images/licenses" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  --data-urlencode "image_id=59656357")

echo "The next step requires the jq program."

LICENSE_ID=$(jq -r .data[0].id <<< $RESPONSE)

REDOWNLOAD_DATA='{
  "size": "huge"
}'

curl -X POST "https://api-sandbox.shutterstock.com/v2/images/licenses/$LICENSE_ID/downloads" \
  -d "$REDOWNLOAD_DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"
export SHUTTERSTOCK_SANDBOX="true"

echo '{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "price": 12.50,
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
}' > data.json

shutterstock images license-images \
  data.json
// Simulate licensing the image in the sandbox
$licenseBody = [
  "images" => [
    [
      "image_id" => "539753938",
      "subscription_id" => "s12345678",
      "price"=> 12.50,
      "metadata"=> [
        "customer_id"=> "12345"
      ]
    ]
  ]
];
$encodedLicenseBody = json_encode($licenseBody);

$licenseOptions = [
  CURLOPT_URL => "https://api-sandbox.shutterstock.com/v2/images/licenses",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedLicenseBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$licenseHandle = curl_init();
curl_setopt_array($licenseHandle, $licenseOptions);
$licenseResponse = curl_exec($licenseHandle);
curl_close($licenseHandle);

$decodedLicenseResponse = json_decode($licenseResponse);
print_r($decodedLicenseResponse);

// Get a list of sandbox licenses for that image ID
$licenseHistoryOptions = [
  CURLOPT_URL => "https://api-sandbox.shutterstock.com/v2/images/licenses?image_id=539753938",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$licenseHistoryHandle = curl_init();
curl_setopt_array($licenseHistoryHandle, $licenseHistoryOptions);
$licenseHistoryResponse = curl_exec($licenseHistoryHandle);
curl_close($licenseHistoryHandle);

$decodedLicenseHistoryResponse = json_decode($licenseHistoryResponse);
print_r($decodedLicenseHistoryResponse);
$licenseId = $decodedLicenseHistoryResponse['data[0]->id'];

// Redownload image
$redownloadBody = [
  "size" => "huge"
];
$encodedRedownloadBody = json_encode($redownloadBody);

$options = [
  CURLOPT_URL => "https://api-sandbox.shutterstock.com/v2/images/licenses/e123/downloads",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedRedownloadBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$redownloadHandle = curl_init();
curl_setopt_array($redownloadHandle, $redownloadOptions);
$redownloadResponse = curl_exec($redownloadHandle);
curl_close($redownloadHandle);

$decodedRedownloadResponse = json_decode($redownloadResponse);
print_r($decodedRedownloadResponse);
const sstk = require("shutterstock-api");

sstk.setSandbox(true);

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const imageToLicense = "419235589";

const body = {
  "images": [
    {
      "image_id": imageToLicense,
      "subscription_id": "s12345678",
      "price": 12.50,
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
};

// Simulate licensing the image in the sandbox
imagesApi.licenseImages(body)
  .then((data) => {
    // Get a list of sandbox licenses for that image ID
    console.log(data);
    return imagesApi.getImageLicenseList({ "image_id": imageToLicense });
  })
  .then((data) => {
    // Redownload image
    console.log(data);
    if (data.total_count < 1) {
      throw new Error("Image does not have a license in the sandbox.");
    }
    const licenseId = data.data[0].id;
    return imagesApi.downloadImage(licenseId, { "size": "huge" });
  })
  .then((data) => {
    // Get redownload URL
    console.log(data.url);
  })
  .catch((error) => {
    console.error(error);
  });

You can use the licensing sandbox API to test your application's licensing, downloading, and license history code for images, video, and audio and verify that your subscription is working. Editorial licensing is not available in the sandbox. To use the sandbox, change the base URL of your requests to https://api-sandbox.shutterstock.com. If you are using the JavaScript SDK, use the setSandbox method, as in the example in the right-hand pane (requires SDK version 1.0.11 or later).

The sandbox API verifies that the subscription is valid for requests just like the main API. It also returns the same HTTP status codes, so the licensing endpoints return a 200 OK code if the request was valid. The sandbox API uses the same applications and it requires the same authentication and subscriptions as the main API.

The licensing sandbox API is exactly like the main API except for these differences:

All other endpoints in the sandbox API work exactly the same way as the main API.

Request metadata

The licensing request body must include metadata that includes details about the licensing request. The specific metadata fields depend on your subscription type and on the type of media that you are licensing. Some customers use this metadata to track details about how they use the media, such as the project that they licensed the media for. Resellers use this metadata to track the customer that they licensed the media to and the price that they charged.

API subscriptions

Example request body for API subscriptions

{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "price": 22.50,
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
}

If you are using an API subscription from the API subscription page, you must include the price and metadata.customer_id fields in the request body, as in the example in the right-hand column. These fields are for resellers to record their customer's ID and the floating-point price that they charged to the customer, within the restrictions of their revenue-sharing agreement. If you are using an API subscription and are not reselling the media, you can pass any string in the customer_id field and 0 in the price field.

For more information about API subscriptions, see Subscriptions.

Enterprise subscriptions

Example request body for Premier subscriptions

{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "metadata": {
        "purchase_order": "123456",
        "client": "Company A",
        "job": "Important project",
        "other": "Important media"
      }
    }
  ]
}

Enterprise partners who are using Premier subscriptions must provide a metadata object on each media item to license. These partners customize their integration to have up to 4 metadata fields for tracking, grouping, or correlating licensing transactions on their invoices. Each integration requires a different set of metadata fields.

In this case, you must pass an empty or non-empty value for each field that your integration requires, as in the example in the right-hand column. To find the metadata fields that are required or optional for your subscription, use the GET /v2/user/subscriptions endpoint or contact your account representative.

Revenue-sharing subscriptions

Example request body for revenue-sharing subscriptions

{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "price": 22.50,
      "metadata": {
        "customer_id": "12345",
        "geo_location": "US",
        "number_viewed": "15",
        "search_term": "dog"
      }
    }
  ]
}

Downloads under revenue-sharing programs must include the floating-point number final cost to the end customer in the price field. The revenue sharer keeps a percentage of this cost based on its agreement with Shutterstock. This price can not be lower than the price floor for the media asset; if it is, the API changes it to the price floor for the asset.

Subscriptions with comp licenses

Complimentary (comp) licenses are used for testing purposes, unlimited plans, and other special cases. The request for a comp license is the same as for any other type of license, but the resulting license is not always the same. If the subscription is configured for testing purposes and similar cases, the API provides a dummy license. This dummy license does not provide any rights to the customer; it permits customers to view the media without a full license. In this case, the customers have no rights to use the media in any way.

When the API processes a comp license transaction, it does not validate the metadata. Therefore, if you are using comp licenses for testing purposes and your transactions require metadata, you must make sure that the metadata is accurate.

Retrieving metadata

Response that includes licensing request metadata

{
  "data": [
    {
      "id": "i101534558",
      "user": {
        "username": "userone"
      },
      "license": "media",
      "subscription_id": "s12345678",
      "download_time": "2019-11-01T12:10:22-05:00",
      "metadata": {
        "purchase_order": "123456",
        "client": "Company A",
        "job": "Important project",
        "other": "Important media"
      },
      "is_downloadable": false,
      "image": {
        "id": "499124106",
        "format": {
          "size": "huge"
        }
      }
    }
  ]
}

To retrieve licensing request metadata, use the GET /v2/images/licenses endpoint. The response includes the metadata that was sent with each license request.

Redownloading media

Get a list of existing licenses

curl -X GET "https://api.shutterstock.com/v2/images/licenses" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
shutterstock images get-image-license-list
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/licenses",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

imagesApi.getImageLicenseList()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Example response

{
  "data": [
  {
    "id": "i4117504982",
    "user": {
      "username": "jsmith"
      },
    "license": "standard",
    "subscription_id": "s12345678",
    "download_time": "2018-08-31T14:27:10-04:00",
    "image": {
      "id": "1079756147",
      "format": {
        "size": "huge"
      }
    }
  },
  {
    "id": "i4117504971",
    "user": {
      "username": "jsmith"
      },
    "license": "standard",
    "subscription_id": "s12345678",
    "download_time": "2018-08-31T14:27:10-04:00",
    "image": {
      "id": "59656357",
      "format": {
        "size": "huge"
      }
    }
  }
  ]
}

Get a redownload link

curl -X POST "https://api.shutterstock.com/v2/images/licenses/i4152144892/downloads" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{}' > data.json

shutterstock images download-image i4152144892 data.json
$body = [];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/licenses/i4152144892/downloads",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const body = {
  "size": "huge"
};

imagesApi.downloadImage("i4152144892", body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

Example response

{
  "url":"https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_1079756147.jpg"
}

Most of the time, you download media as soon as you license it, but some subscription types allow you to redownload media later. Platform licenses that you request through the API do not allow redownloads. Shutterstock considers each license to be a unique transaction for a single use of the media, so licensing a media item once does not necessarily mean that you can retrieve it later.

You can use the appropriate endpoint, such as GET /v2/images/licenses, to see your licenses. Then, if your subscription permits redownloads, you can use the license ID to request a new download URL from the POST v2/images/licenses/{license_id}/downloads endpoint, as in the example in the right-hand column.

Organizing media

Within the Shutterstock API, you have two options for organizing media:

Create a catalog collection and add assets

CREATE_CATALOG_COLLECTION='{
  "name": "My catalog",
  "visibility": "public",
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
}'

RESPONSE=$(curl -X POST "https://api.shutterstock.com/v2/catalog/collections" \
  -d "$CREATE_CATALOG_COLLECTION" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN")

echo "The next step requires the jq program."

CATALOG_COLLECTION_ID=$(jq -r .id <<< $RESPONSE)

ADD_ASSETS='{
  "items": [
    {
      "asset": {
        "id": "1718706469",
        "type": "image"
      }
    },
    {
      "asset": {
        "id": "4201711",
        "type": "video"
      }
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/catalog/collections/$CATALOG_COLLECTION_ID/items" \
  -d "$ADD_ASSETS" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "name": "My catalog collection",
  "visibility": "public",
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
}' > createCatalogCollection.json

RESPONSE=$(shutterstock catalog create-collection createCatalogCollection.json)

echo "The next step requires the jq program."

CATALOG_COLLECTION_ID=$(jq -r .id <<< $RESPONSE)

echo '{
  "items": [
    {
      "asset": {
        "id": "1718706469",
        "type": "image"
      }
    },
    {
      "asset": {
        "id": "4201711",
        "type": "video"
      }
    }
  ]
}' > addAssets.json

shutterstock catalog add-to-collection $CATALOG_COLLECTION_ID addAssets.json
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const catalogApi = new sstk.CatalogApi();

const createCatalogCollectionBody = {
  "name": "My catalog collection",
  "visibility": "public",
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
};

const addAssetsBody = {
  "items": [
    {
      "asset": {
        "id": "1718706469",
        "type": "image"
      }
    },
    {
      "asset": {
        "id": "4201711",
        "type": "video"
      }
    }
  ]
};

catalogApi.createCollection(createCatalogCollectionBody)
  .then(({ id }) => catalogApi.addToCollection(id, addAssetsBody))
  .catch((error) => {
    console.error(error);
  });
$createCatalogCollectionBody = [
  "name" => "New catalog",
  "visibility" => "public",
  "items": [
    [
      "asset": [
        "id" => "1690105108",
        "type" => "image"
      ]
    ]
  ]
];
$encodedCreateCatalogCollectionBody = json_encode($createCatalogCollectionBody);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/catalog/collections",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedCreateCatalogCollectionBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
$catalogCollectionId = $decodedResponse->id;

$addAssetsBody = [
  "items" => [
    [
      "asset" => [
        "id" => "1718706469",
        "type" => "image"
      ]
    ],
    [
      "asset" => [
        "id" => "4201711",
        "type" => "video"
      ]
    ]
  ]
];
$encodedAddAssetsBody = json_encode($addAssetsBody);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/catalog/collections/$catalogCollectionId/items",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedAddAssetsBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

Assets API

The endpoints in the Assets API provide access to Shutterstock assets, including images, videos, audio tracks, and editorial media.

Images

Search for images

curl -X GET "https://api.shutterstock.com/v2/images/search" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=Vienna" \
  --data-urlencode "orientation=horizontal" \
  --data-urlencode "sort=popular"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "query": "New York",
  "sort": "popular",
  "orientation": "horizontal"
};

imagesApi.searchImages(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "query" => "New York",
  "sort" => "popular",
  "orientation" => "horizontal"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images search-images \
  --query Vienna \
  --orientation horizontal \
  --sort popular

GET /v2/images/search Try it out

This endpoint searches for images. If you specify more than one search parameter, the API uses an AND condition. Array parameters can be specified multiple times; in this case, the API uses an AND or an OR condition with those values, depending on the parameter. You can also filter search terms out in the query parameter by prefixing the term with NOT. Free API accounts show results only from a limited library of media, not the full Shutterstock media library. Also, the number of search fields they can use in a request is limited.

Parameters

Parameter Type Description
added_date string

Show images added on the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
added_date_end string

Show images added before the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
added_date_start string

Show images added on or after the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
ai_industry string

For AI-powered search, specify the industry to target; requires that the ai_search parameter is set to true

Valid values: automotive, cpg, finance, healthcare, retail, technology

ai_labels_limit integer

For AI-powered search, specify the maximum number of labels to return

Maximum: 500

Default: 20

ai_objective string

For AI-powered search, specify the goal of the media; requires that the ai_search parameter is set to true

Valid values: awareness, traffic, conversions

ai_search boolean

Set to true and specify the ai_objective and ai_industry parameters to use AI-powered search; the API returns information about how well images meet the objective for the industry

ai_industry is required

ai_objective is required

aspect_ratio number

Show images with the specified aspect ratio, using a positive decimal of the width divided by the height, such as 1.7778 for a 16:9 image

aspect_ratio_max number

Show images with the specified aspect ratio or lower, using a positive decimal of the width divided by the height, such as 1.7778 for a 16:9 image

aspect_ratio_min number

Show images with the specified aspect ratio or higher, using a positive decimal of the width divided by the height, such as 1.7778 for a 16:9 image

category string

Show images with the specified Shutterstock-defined category; specify a category name or ID

color string

Specify either a hexadecimal color in the format '4F21EA' or 'grayscale'; the API returns images that use similar colors

contributor [string]

Show images with the specified contributor names or IDs, allows multiple

contributor_country [string]

Show images from contributors in one or more specified countries, or start with NOT to exclude a country from the search

One of these formats:

  • Format: A two-character (ISO 3166 Alpha-2) country code
    Example: US
  • Format: A NOT followed by a two-character (ISO 3166 Alpha-2) country code
    Example: NOT US

fields string

Fields to display in the response; see the documentation for the fields parameter in the overview section

height_from integer

Show images with the specified height or larger, in pixels

height_to integer

Show images with the specified height or smaller, in pixels

image_type [string]

Show images of the specified type

Valid values: photo, illustration, vector

keyword_safe_search boolean

Hide results with potentially unsafe keywords

Default: true

language Language

Set query and result language (uses Accept-Language header if not set)

license [string]

Show only images with the specified license

Default: [commercial]

Valid values: commercial, editorial, enhanced

model [string]

Show image results with the specified model IDs

orientation string

Show image results with horizontal or vertical orientation

Valid values: horizontal, vertical

page integer

Page number

Minimum: 1

Default: 1

people_age string

Show images that feature people of the specified age category

Valid values: infants, children, teenagers, 20s, 30s, 40s, 50s, 60s, older

people_ethnicity [string]

Show images with people of the specified ethnicities, or start with NOT to show images without those ethnicities

Valid values: african, african_american, black, brazilian, chinese, caucasian, east_asian, hispanic, japanese, middle_eastern, native_american, pacific_islander, south_asian, southeast_asian, other, NOT african, NOT african_american, NOT black, NOT brazilian, NOT chinese, NOT caucasian, NOT east_asian, NOT hispanic, NOT japanese, NOT middle_eastern, NOT native_american, NOT pacific_islander, NOT south_asian, NOT southeast_asian, NOT other

people_gender string

Show images with people of the specified gender

Valid values: male, female, both

people_model_released boolean

Show images of people with a signed model release

people_number integer

Show images with the specified number of people

Maximum: 4

per_page integer

Number of results per page

Maximum: 500

Default: 20

query string

One or more search terms separated by spaces; you can use NOT to filter out images that match a term

region string

Raise or lower search result rankings based on the result's relevance to a specified region; you can provide a country code or an IP address from which the API infers a country

One of these formats:

  • Format: A two-character (ISO 3166 Alpha-2) country code
    Example: US
  • Format: A valid IPv4 address
    Example: 1.1.1.1

safe boolean

Enable or disable safe search

Default: true

sort string

Sort by

Default: popular

Valid values: newest, popular, relevance, random

spellcheck_query boolean

Spellcheck the search query and return results on suggested spellings

Default: true

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

width_from integer

Show images with the specified width or larger, in pixels

width_to integer

Show images with the specified width or smaller, in pixels

height integer

(Deprecated; use height_from and height_to instead) Show images with the specified height

width integer

(Deprecated; use width_from and width_to instead) Show images with the specified width

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1572478477",
      "aspect": 1.5,
      "assets": {
        "preview": {
          "height": 300,
          "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 450
        },
        "small_thumb": {
          "height": 67,
          "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 100
        },
        "large_thumb": {
          "height": 100,
          "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 150
        },
        "mosaic": {
          "height": 167,
          "url": "https://image.shutterstock.com/image-photo/stock-photo-cropped-image-of-woman-gardening-250nw-1572478477.jpg",
          "width": 250
        },
        "huge_thumb": {
          "height": 260,
          "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
          "width": 390
        },
        "preview_1000": {
          "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
          "width": 1000,
          "height": 667
        },
        "preview_1500": {
          "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 1500,
          "height": 1000
        }
      },
      "contributor": {
        "id": "250738318"
      },
      "description": "cropped image of woman gardening",
      "image_type": "photo",
      "has_model_release": true,
      "media_type": "image"
    }
  ],
  "page": 1,
  "per_page": 5,
  "search_id": "749090bb-2967-4a20-b22e-c800dc845e10",
  "spellcheck_info": {},
  "total_count": 45
}

Responses

Status Description Schema
200 OK ImageSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Run multiple image searches

DATA='[
  {
    "query": "cat",
    "license": ["editorial"],
    "sort": "popular"
  },
  {
    "query": "dog",
    "orientation": "horizontal"
  }
]'

curl -X POST "https://api.shutterstock.com/v2/bulk_search/images" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H 'Content-Type: application/json' \
  -d "$DATA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const bulkSearchApi = new sstk.BulkSearchApi();

const body = [
  {
    "query": "cat",
    "license": ["editorial"],
    "sort": "popular"
  },
  {
    "query": "dog",
    "orientation": "horizontal"
  }
];

bulkSearchApi.bulkSearchImages(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  [
    "query" => "cat",
    "license" => ["editorial"],
    "sort" => "popular"
  ],
  [
    "query" => "dog",
    "orientation" => "horizontal"
  ]
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/bulk_search/images",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '[
  {
    "query": "cat",
    "license": ["editorial"],
    "sort": "popular"
  },
  {
    "query": "dog",
    "orientation": "horizontal"
  }
]' > data.json

shutterstock bulk-search bulk-search-images data.json

POST /v2/bulk_search/images Try it out

This endpoint runs up to 5 image searches in a single request and returns up to 20 results per search. You can provide global search parameters in the query parameters and override them for each search in the body parameter. The query and body parameters are the same as in the GET /v2/images/search endpoint.

Parameters

Parameter Type Description
added_date string

Show images added on the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
added_date_end string

Show images added before the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
added_date_start string

Show images added on or after the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
aspect_ratio number

Show images with the specified aspect ratio, using a positive decimal of the width divided by the height, such as 1.7778 for a 16:9 image

aspect_ratio_max number

Show images with the specified aspect ratio or lower, using a positive decimal of the width divided by the height, such as 1.7778 for a 16:9 image

aspect_ratio_min number

Show images with the specified aspect ratio or higher, using a positive decimal of the width divided by the height, such as 1.7778 for a 16:9 image

category string

Show images with the specified Shutterstock-defined category; specify a category name or ID

color string

Specify either a hexadecimal color in the format '4F21EA' or 'grayscale'; the API returns images that use similar colors

contributor [string]

Show images with the specified contributor names or IDs, allows multiple

contributor_country [string]

Show images from contributors in one or more specified countries, or start with NOT to exclude a country from the search

One of these formats:

  • Format: A two-character (ISO 3166 Alpha-2) country code
    Example: US
  • Format: A NOT followed by a two-character (ISO 3166 Alpha-2) country code
    Example: NOT US

fields string

Fields to display in the response; see the documentation for the fields parameter in the overview section

height_from integer

Show images with the specified height or larger, in pixels

height_to integer

Show images with the specified height or smaller, in pixels

image_type [string]

Show images of the specified type

Valid values: photo, illustration, vector

keyword_safe_search boolean

Hide results with potentially unsafe keywords

Default: true

language Language

Set query and result language (uses Accept-Language header if not set)

license [string]

Show only images with the specified license

Default: [commercial]

Valid values: commercial, editorial, enhanced

model [string]

Show image results with the specified model IDs

orientation string

Show image results with horizontal or vertical orientation

Valid values: horizontal, vertical

page integer

Page number

Minimum: 1

Default: 1

people_age string

Show images that feature people of the specified age category

Valid values: infants, children, teenagers, 20s, 30s, 40s, 50s, 60s, older

people_ethnicity [string]

Show images with people of the specified ethnicities, or start with NOT to show images without those ethnicities

Valid values: african, african_american, black, brazilian, chinese, caucasian, east_asian, hispanic, japanese, middle_eastern, native_american, pacific_islander, south_asian, southeast_asian, other, NOT african, NOT african_american, NOT black, NOT brazilian, NOT chinese, NOT caucasian, NOT east_asian, NOT hispanic, NOT japanese, NOT middle_eastern, NOT native_american, NOT pacific_islander, NOT south_asian, NOT southeast_asian, NOT other

people_gender string

Show images with people of the specified gender

Valid values: male, female, both

people_model_released boolean

Show images of people with a signed model release

people_number integer

Show images with the specified number of people

Maximum: 4

per_page integer

Number of results per page

Maximum: 20

Default: 20

region string

Raise or lower search result rankings based on the result's relevance to a specified region; you can provide a country code or an IP address from which the API infers a country

One of these formats:

  • Format: A two-character (ISO 3166 Alpha-2) country code
    Example: US
  • Format: A valid IPv4 address
    Example: 1.1.1.1

safe boolean

Enable or disable safe search

Default: true

sort string

Sort by

Default: popular

Valid values: newest, popular, relevance, random

spellcheck_query boolean

Spellcheck the search query and return results on suggested spellings

Default: true

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

width_from integer

Show images with the specified width or larger, in pixels

width_to integer

Show images with the specified width or smaller, in pixels

height integer

(Deprecated; use height_from and height_to instead) Show images with the specified height

width integer

(Deprecated; use width_from and width_to instead) Show images with the specified width

Body

Schema: BulkImageSearchRequest

List of queries to request results for and filters to apply per query; these values override the defaults in the query parameters

Field Type Description
      [BulkImageSearchRequest]

List of searches

Accepted authentication

Example responses

OK

{
  "results": [
    {
      "data": [
        {
          "id": "1572478477",
          "aspect": 1.5,
          "assets": {
            "preview": {
              "height": 300,
              "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
              "width": 450
            },
            "small_thumb": {
              "height": 67,
              "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
              "width": 100
            },
            "large_thumb": {
              "height": 100,
              "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
              "width": 150
            },
            "mosaic": {
              "height": 167,
              "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-250nw-1572478477.jpg",
              "width": 250
            },
            "huge_thumb": {
              "height": 260,
              "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
              "width": 390
            },
            "preview_1000": {
              "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
              "width": 1000,
              "height": 667
            },
            "preview_1500": {
              "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
              "width": 1500,
              "height": 1000
            }
          },
          "contributor": {
            "id": "250738318"
          },
          "description": "cropped image of woman gardening",
          "image_type": "photo",
          "has_model_release": true,
          "media_type": "image"
        }
      ],
      "page": 1,
      "per_page": 5,
      "search_id": "749090bb-2967-4a20-b22e-c800dc845e10",
      "spellcheck_info": {},
      "total_count": 45
    },
    {
      "data": [],
      "page": 1,
      "per_page": 5,
      "search_id": "749090bb-2967-4a20-b22e-c800dc845e11",
      "spellcheck_info": {},
      "total_count": 0
    }
  ]
}

Responses

Status Description Schema
200 OK BulkImageSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get suggestions for a search term

curl -X GET "https://api.shutterstock.com/v2/images/search/suggestions" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=cats"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "query": "cats",
};

imagesApi.getImageSuggestions(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "query" => "cats"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search/suggestions" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-image-suggestions \
  --query cats

GET /v2/images/search/suggestions Try it out

This endpoint provides autocomplete suggestions for partial search terms.

Parameters

Parameter Type Description
query
(Required)
string

Search term for which you want keyword suggestions

limit integer

Limit the number of suggestions

Minimum: 1

Maximum: 25

Default: 10

Accepted authentication

Example responses

OK

{
  "data": [
    "cat scan",
    "cats and dogs",
    "cats playing",
    "catsuit",
    "cat silhouette",
    "catskills",
    "cats eyes",
    "cat sitting",
    "cat sleeping",
    "cats eye"
  ]
}

Responses

Status Description Schema
200 OK Suggestions
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get keywords from text

DATA='{"text": "The beach is a wonderful place to visit. It has beautiful sand and ocean waves."}'

curl -X POST "https://api.shutterstock.com/v2/images/search/suggestions" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const body = {
  "text": "The beach is a wonderful place to visit. It has beautiful sand and ocean waves."
};

imagesApi.getImageKeywordSuggestions(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "text" => "The beach is a wonderful place to visit. It has beautiful sand and ocean waves."
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/search/suggestions",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{"text": "The beach is a wonderful place to visit. It has beautiful sand and ocean waves."}' > data.json

shutterstock images get-image-keyword-suggestions data.json

POST /v2/images/search/suggestions Try it out

This endpoint returns up to 10 important keywords from a block of plain text.

Parameters

None.

Body

Schema: SearchEntitiesRequest

Plain text to extract keywords from

Field Type Description
text
(Required)
string

Plain text to extract keywords from

Minimum length: 1

Maximum length: 100000

Accepted authentication

Example responses

OK

{
  "data": [
    "beach",
    "place",
    "sand",
    "ocean"
  ]
}

Responses

Status Description Schema
200 OK SearchEntitiesResponse
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List image categories

curl -X GET "https://api.shutterstock.com/v2/images/categories" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "language=es"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "language": "es",
};

imagesApi.listImageCategories(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "language" => "es"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/categories" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images list-image-categories \
  --language es

GET /v2/images/categories Try it out

This endpoint lists the categories (Shutterstock-assigned genres) that images can belong to.

Parameters

Parameter Type Description
language Language

Language for the keywords and categories in the response

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1",
      "name": "Animals/Wildlife"
    },
    {
      "id": "11",
      "name": "The Arts"
    }
  ],
  "page": 1,
  "per_page": 2,
  "total_count": 13
}

Responses

Status Description Schema
200 OK CategoryDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List similar images

curl -X GET "https://api.shutterstock.com/v2/images/465011609/similar" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "language=es"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "language": "es",
};

imagesApi.listSimilarImages("465011609", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "language" => "es"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/465011609/similar" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images list-similar-images 465011609 \
  --language es

GET /v2/images/{id}/similar Try it out

This endpoint returns images that are visually similar to an image that you specify.

Parameters

Parameter Type Description
id
(Required)
string

Image ID

Format: /^([1-9]\d*)|(U[a-zA-Z0-9]+)$/

language Language

Language for the keywords and categories in the response

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 500

Default: 20

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1572478477",
      "aspect": 1.5,
      "assets": {
        "preview": {
          "height": 300,
          "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 450
        },
        "small_thumb": {
          "height": 67,
          "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 100
        },
        "large_thumb": {
          "height": 100,
          "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 150
        },
        "mosaic": {
          "height": 167,
          "url": "https://image.shutterstock.com/image-photo/stock-photo-cropped-image-of-woman-gardening-250nw-1572478477.jpg",
          "width": 250
        },
        "huge_thumb": {
          "height": 260,
          "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
          "width": 390
        },
        "preview_1000": {
          "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
          "width": 1000,
          "height": 667
        },
        "preview_1500": {
          "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 1500,
          "height": 1000
        }
      },
      "contributor": {
        "id": "250738318"
      },
      "description": "cropped image of woman gardening",
      "image_type": "photo",
      "has_model_release": true,
      "media_type": "image"
    }
  ],
  "page": 1,
  "per_page": 5,
  "search_id": "749090bb-2967-4a20-b22e-c800dc845e10",
  "spellcheck_info": {},
  "total_count": 45
}

Responses

Status Description Schema
200 OK ImageSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None
curl -X GET "https://api.shutterstock.com/v2/images/recommendations" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "id=465011609"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "id": [
    "465011609",
  ],
};

imagesApi.getImageRecommendations(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$query = "id=465011609";

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/recommendations?$query",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-image-recommendations \
  --id 465011609

GET /v2/images/recommendations Try it out

This endpoint returns images that customers put in the same collection as the specified image IDs.

Parameters

Parameter Type Description
id
(Required)
[string]

Image IDs

max_items integer

Maximum number of results returned in the response

Minimum: 1

Maximum: 500

Default: 20

safe boolean

Restrict results to safe images

Default: true

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "123456789"
    },
    {
      "id": "99379946"
    },
    {
      "id": "133918412"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 12
}

Responses

Status Description Schema
200 OK RecommendationDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List updated images

curl -X GET "https://api.shutterstock.com/v2/images/updated" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "interval=30 MINUTE"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "interval": "30 MINUTE"
};

imagesApi.getUpdatedImages(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "interval" => "30 MINUTE"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/updated?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-updated-images \
  --interval "30 MINUTE"

GET /v2/images/updated Try it out

This endpoint lists images that have been updated in the specified time period to update content management systems (CMS) or digital asset management (DAM) systems. In most cases, use the interval parameter to show images that were updated recently, but you can also use the start_date and end_date parameters to specify a range of no more than three days. Do not use the interval parameter with either start_date or end_date.

Parameters

Parameter Type Description
end_date string

Show images updated before the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
interval string

Show images updated in the specified time period, where the time period is an interval (like SQL INTERVAL) such as 1 DAY, 6 HOUR, or 30 MINUTE; the default is 1 HOUR, which shows images that were updated in the hour preceding the request

Default: 1 HOUR

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 2000

Default: 100

sort string

Sort order

Default: newest

Valid values: newest, oldest

start_date string

Show images updated on or after the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
type [string]

Show images that were added, deleted, or edited; by default, the endpoint returns images that were updated in any of these ways

Valid values: addition, deletion, edit

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "123456789",
      "updated_time": "2020-05-29T12:10:22-05:00",
      "updates": [
        "addition",
        "edit"
      ]
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 13
}

Responses

Status Description Schema
200 OK UpdatedMediaDataList

Details

List images

curl -X GET "https://api.shutterstock.com/v2/images" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "id=1110335168" \
  --data-urlencode "id=465011609" \
  --data-urlencode "view=minimal" \
  --data-urlencode "search_id=00000000-0000-0000-0000-000000000000"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "id": [
    "1110335168",
    "465011609",
  ],
  "view": "minimal",
  "search_id": "00000000-0000-0000-0000-000000000000",
};

imagesApi.getImageList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$query = "id=1110335168&id=465011609&view=minimal&search_id=00000000-0000-0000-0000-000000000000";

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images?$query",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-image-list \
  --id 1110335168 \
  --id 465011609 \
  --view minimal \
  --search_id 00000000-0000-0000-0000-000000000000

GET /v2/images Try it out

This endpoint lists information about one or more images, including the available sizes.

Parameters

Parameter Type Description
id
(Required)
[string]

One or more image IDs

Format: A Shutterstock asset ID that starts with a nonzero digit and has any number of other digits
Example: 18765466

Maximum length: 500

search_id string

The ID of the search that is related to this request

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1572478477",
      "aspect": 1.5,
      "assets": {
        "preview": {
          "height": 300,
          "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 450
        },
        "small_thumb": {
          "height": 67,
          "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 100
        },
        "large_thumb": {
          "height": 100,
          "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 150
        },
        "mosaic": {
          "height": 167,
          "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-250nw-1572478477.jpg",
          "width": 250
        },
        "huge_thumb": {
          "height": 260,
          "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
          "width": 390
        },
        "preview_1000": {
          "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
          "width": 1000,
          "height": 667
        },
        "preview_1500": {
          "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 1500,
          "height": 1000
        }
      },
      "contributor": {
        "id": "250738318"
      },
      "description": "cropped image of woman gardening",
      "image_type": "photo",
      "has_model_release": true,
      "media_type": "image"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

Responses

Status Description Schema
200 OK ImageDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get details about images

curl -X GET "https://api.shutterstock.com/v2/images/465011609" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "language=es" \
  --data-urlencode "search_id=00000000-0000-0000-0000-000000000000"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "language": "es",
  "search_id": "00000000-0000-0000-0000-000000000000",
};

imagesApi.getImage("465011609", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "language" => "es",
  "search_id" => "00000000-0000-0000-0000-000000000000"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/465011609" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-image 465011609 \
  --language es \
  --search_id 00000000-0000-0000-0000-000000000000

GET /v2/images/{id} Try it out

This endpoint shows information about an image, including a URL to a preview image and the sizes that it is available in.

Parameters

Parameter Type Description
id
(Required)
string

Image ID

Format: A Shutterstock asset ID that starts with a nonzero digit and has any number of other digits
Example: 18765466
language Language

Language for the keywords and categories in the response

search_id string

The ID of the search that is related to this request

view string

Amount of detail to render in the response

Default: full

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "id": "1572478477",
  "aspect": 1.5,
  "assets": {
    "preview": {
      "height": 300,
      "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
      "width": 450
    },
    "small_thumb": {
      "height": 67,
      "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
      "width": 100
    },
    "large_thumb": {
      "height": 100,
      "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
      "width": 150
    },
    "mosaic": {
      "height": 167,
      "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-250nw-1572478477.jpg",
      "width": 250
    },
    "huge_thumb": {
      "height": 260,
      "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
      "width": 390
    },
    "preview_1000": {
      "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
      "width": 1000,
      "height": 667
    },
    "preview_1500": {
      "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
      "width": 1500,
      "height": 1000
    }
  },
  "contributor": {
    "id": "250738318"
  },
  "description": "cropped image of woman gardening",
  "image_type": "photo",
  "has_model_release": true,
  "media_type": "image",
  "original_filename": "123.jpg"
}

Responses

Status Description Schema
200 OK Image
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Licenses And Downloads

License images

DATA='{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "price": 12.50,
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/images/licenses" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H 'Content-Type: application/json' \
  -d "$DATA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const body = {
  "images": [
    {
      "image_id": "419235589",
      "subscription_id": "s12345678",
      "price": 12.50,
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
};

imagesApi.licenseImages(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "images" => [
    [
      "image_id" => "539753938",
      "subscription_id" => "s12345678",
      "price" => 12.50,
      "metadata" => [
        "customer_id" => "12345"
      ]
    ]
  ]
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/licenses",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "images": [
    {
      "image_id": "59656357",
      "subscription_id": "s12345678",
      "price": 12.50,
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
}' > data.json

shutterstock images license-images \
  data.json

POST /v2/images/licenses Try it out

This endpoint gets licenses for one or more images. You must specify the image IDs in the body parameter and other details like the format, size, and subscription ID either in the query parameter or with each image ID in the body parameter. Values in the body parameter override values in the query parameters. The download links in the response are valid for 8 hours.

Parameters

Parameter Type Description
search_id string

Search ID that was provided in the results of an image search

size string

Image size

Default: huge

Valid values: small, medium, huge, vector, custom

subscription_id string

Subscription ID to use to license the image

format string

(Deprecated) Image format

Valid values: eps, jpg

Body

Schema: LicenseImageRequest

List of images to request licenses for and information about each license transaction; these values override the defaults in the query parameters

Field Type Description
images
(Required)
[LicenseImage] or [LicenseImageVector]

Images to create licenses for

Maximum length: 50

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "image_id": "59656357",
      "download": {
        "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.jpg"
      },
      "allotment_charge": 1
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 23
}

Responses

Status Description Schema
200 OK LicenseImageResultDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List image licenses

curl -X GET "https://api.shutterstock.com/v2/images/licenses" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  -G \
  --data-urlencode "start_date=2016-10-03T01:25:13.521Z" \
  --data-urlencode "end_date=2016-10-04T13:25:13.521Z" \
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "start_date": "2016-10-03T01:25:13.521Z",
  "end_date": "2016-10-04T13:25:13.521Z"
};

imagesApi.getImageLicenseList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "start_date" => "2016-10-03T01:25:13.521Z",
  "end_date" => "2016-10-04T13:25:13.521Z"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/licenses" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-image-license-list \
 --start-date "2021-01-03T01:25:13.521Z" \
 --end-date "2021-05-04T13:25:13.521Z"

GET /v2/images/licenses Try it out

This endpoint lists existing licenses.

Parameters

Parameter Type Description
download_availability string

Filter licenses by download availability

Default: all

Valid values: all, downloadable, non_downloadable

end_date string

Show licenses created before the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

Must be > than start_date

image_id string

Show licenses for the specified image ID

Format: /^[1-9]\d*$/ (A number that does not start with 0)

license string

Show images that are available with the specified license, such as standard or enhanced

Format: /^.+$/ (Minimum 1 character)

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 200

Default: 20

sort string

Sort order

Default: newest

Valid values: newest, oldest

start_date string

Show licenses created on or after the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

Must be <= than end_date

team_history boolean

Set to true to see license history for all members of your team.

username string

Filter licenses by username of licensee

Accepted authentication

Example responses

OK

{
  "total_count": 2890,
  "page": 1,
  "per_page": 1,
  "data": [
    {
      "id": "e1eba3833793e77188d22caae8bac9f2cd",
      "user": {
        "username": "editorial_test_account_002"
      },
      "license": "premier_editorial_all_digital",
      "download_time": "2021-07-15T15:46:34.000Z",
      "is_downloadable": false,
      "image": {
        "id": "9763363ao",
        "format": {
          "size": "original"
        }
      },
      "subscription_id": "s12345678",
      "metadata": {
        "purchase_order": "123456",
        "client": "Company A",
        "job": "Important project",
        "other": "Important media"
      }
    }
  ]
}

Responses

Status Description Schema
200 OK DownloadHistoryDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Download images

DATA='{
  "size": "huge"
}'

curl -X POST "https://api.shutterstock.com/v2/images/licenses/e123/downloads" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const licenseId = "e123"; // license ID, not image ID

const body = {
  "size": "huge"
};

imagesApi.downloadImage(licenseId, body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "size" => "huge"
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/licenses/e123/downloads",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "size": "huge"
}' > data.json

shutterstock images download-image e123 data.json

POST /v2/images/licenses/{id}/downloads Try it out

This endpoint redownloads images that you have already received a license for. The download links in the response are valid for 8 hours.

Parameters

Parameter Type Description
id
(Required)
string

License ID

Body

Schema: RedownloadImage

Information about the images to redownload

Field Type Description
size string

Size of the image

Valid values: small, medium, huge, supersize, vector

auth_cookie Cookie

(Deprecated)

name
(Required)
string

The name of the cookie

value
(Required)
string

The value of the cookie

show_modal boolean

(Deprecated)

verification_code string

(Deprecated)

Accepted authentication

Example responses

OK

{
  "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.jpg"
}

Responses

Status Description Schema
200 OK Url
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Collections

Create image collections

DATA='{
  "name": "My collection"
}'

curl -X POST "https://api.shutterstock.com/v2/images/collections" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const body = {
  "name": "My collection"
};

imagesApi.createImageCollection(body)
  .catch((error) => {
    console.error(error);
  });
$body = [
  "name" => "My collection"
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "name": "My collection"
}' > data.json

shutterstock images create-image-collection data.json

POST /v2/images/collections Try it out

This endpoint creates one or more image collections (lightboxes). To add images to the collections, use POST /v2/images/collections/{id}/items.

Parameters

None.

Body

Schema: CollectionCreateRequest

The names of the new collections

Field Type Description
name
(Required)
string

The name of the collection

Accepted authentication

Example responses

Successfully created image collection

{
  "id": "48433105"
}

Responses

Status Description Schema
201 Successfully created image collection CollectionCreateResponse
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List image collections

curl -X GET "https://api.shutterstock.com/v2/images/collections" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "embed=share_code" \
  --data-urlencode "page=1" \
  --data-urlencode "per_page=2"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "embed": "share_code",
  "page": "1",
  "per_page": "2",
};

imagesApi.getImageCollectionList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "embed" => "share_code",
  "page" => "1",
  "per_page" => "2"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-image-collection-list \
  --embed share_code \
  --page 1 \
  --per_page 2

GET /v2/images/collections Try it out

This endpoint lists your collections of images and their basic attributes.

Parameters

Parameter Type Description
embed [string]

Which sharing information to include in the response, such as a URL to the collection

Valid values: share_code, share_url

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 150

Default: 100

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "293542904",
      "name": "My collection",
      "total_item_count": 85,
      "items_updated_time": "2021-05-20T16:15:22-04:00",
      "cover_item": {
        "id": "297886754"
      }
    }
  ],
  "page": 1,
  "per_page": 100,
  "total_count": 1
}

Responses

Status Description Schema
200 OK CollectionDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get the details of image collections

curl -X GET "https://api.shutterstock.com/v2/images/collections/126351027" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

imagesApi.getImageCollection("126351027")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections/126351027",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-image-collection 126351027

GET /v2/images/collections/{id} Try it out

This endpoint gets more detailed information about a collection, including its cover image and timestamps for its creation and most recent update. To get the images in collections, use GET /v2/images/collections/{id}/items.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

embed [string]

Which sharing information to include in the response, such as a URL to the collection

Valid values: share_code, share_url

share_code string

Code to retrieve a shared collection

Accepted authentication

Example responses

OK

{
  "id": "293542904",
  "name": "My collection",
  "total_item_count": 85,
  "items_updated_time": "2021-05-20T16:15:22-04:00",
  "cover_item": {
    "id": "297886754"
  }
}

Responses

Status Description Schema
200 OK Collection
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Rename image collections

DATA='{
  "name": "My new collection name"
}'

curl -X POST "https://api.shutterstock.com/v2/images/collections/126351027" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const collectionId = "126351027"; // Collection ID

const body = {
  "name": "My new collection name"
};

imagesApi.renameImageCollection(collectionId, body)
  .catch((error) => {
    console.error(error);
  });
$body = [
  "name" => "My new collection name"
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections/126351027",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "name": "My new collection name"
}' > data.json

shutterstock images rename-image-collection 48433107 data.json

POST /v2/images/collections/{id} Try it out

This endpoint sets a new name for an image collection.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

Body

Schema: CollectionUpdateRequest

The new name for the collection

Field Type Description
name
(Required)
string

The new name of the collection

Accepted authentication

Responses

Status Description Schema
204 Successfully updated collection None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Delete image collections

curl -X DELETE "https://api.shutterstock.com/v2/images/collections/136351027" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const collectionId = "136351027"; // Collection ID

imagesApi.deleteImageCollection(collectionId)
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections/136351027",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_CUSTOMREQUEST => "DELETE",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images delete-image-collection 136351027

DELETE /v2/images/collections/{id} Try it out

This endpoint deletes an image collection.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

Accepted authentication

Responses

Status Description Schema
204 Successfully deleted collection None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Add images to collections

DATA='{
  "items": [
    {
      "id": "49572945",
      "media_type": "image"
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/images/collections/126351027/items" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const collectionId = "126351027"; // Collection ID

const body = {
  "items": [
    {
      "id": "495863218",
      "media_type": "image"
    }
  ]
};

imagesApi.addImageCollectionItems(collectionId, body)
  .catch((error) => {
    console.error(error);
  });
$body = [
  "items" => [
    [
      "id" => "49572945",
      "media_type" => "image"
    ]
  ]
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections/126351027/items",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "items": [
    {
      "id": "49572945",
      "media_type": "image"
    }
  ]
}' > data.json

shutterstock images add-image-collection-items 126351027 data.json

POST /v2/images/collections/{id}/items Try it out

This endpoint adds one or more images to a collection by image IDs.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

Body

Schema: CollectionItemRequest

Array of image IDs to add to the collection

Field Type Description
items
(Required)
[CollectionItem]

List of items

id
(Required)
string

ID of the item

added_time string

The date the item was added to the collection
Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

media_type string

The media type of the item, such as image, video, or audio

Accepted authentication

Responses

Status Description Schema
204 Successfully added collection items None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Get the contents of image collections

curl -X GET "https://api.shutterstock.com/v2/images/collections/126351027/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

imagesApi.getImageCollectionItems("126351027")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections/126351027/items",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-image-collection-items 126351027

GET /v2/images/collections/{id}/items Try it out

This endpoint lists the IDs of images in a collection and the date that each was added.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 150

Default: 100

share_code string

Code to retrieve the contents of a shared collection

sort string

Sort order

Default: oldest

Valid values: newest, oldest

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1690105108",
      "added_time": "2021-07-08T12:33:37.000Z",
      "media_type": "image"
    },
    {
      "id": "1468703072",
      "added_time": "2021-07-08T12:31:43.000Z",
      "media_type": "image"
    }
  ],
  "page": 1,
  "per_page": 2,
  "total_count": 82
}

Responses

Status Description Schema
200 OK CollectionItemDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Remove images from collections

curl -X DELETE "https://api.shutterstock.com/v2/images/collections/186726599/items?item_id=495863218" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const collectionId = "126351027"; // Collection ID

// Array of images to remove
const imagesToRemove = {
  "item_id": [
    "495863218"
  ]
};

imagesApi.deleteImageCollectionItems(collectionId, imagesToRemove)
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections/126351027/items?item_id=495863218",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_CUSTOMREQUEST => "DELETE",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images delete-image-collection-items 186726599 \
  --item-id 495863218

DELETE /v2/images/collections/{id}/items Try it out

This endpoint removes one or more images from a collection.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

item_id [string]

One or more image IDs to remove from the collection

Accepted authentication

Responses

Status Description Schema
204 Successfully removed collection items None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None
curl -X GET "https://api.shutterstock.com/v2/images/collections/featured" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "embed=share_url" \
  --data-urlencode "type=photo" \
  --data-urlencode "asset_hint=1x"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const queryParams = {
  "embed": "share_url",
  "type": [
    "photo",
  ],
  "asset_hint": "1x",
};

imagesApi.getFeaturedImageCollectionList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$query = "embed=share_url&type=photo&asset_hint=1x";

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections/featured?$query",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-featured-image-collection-list \
  --embed share_url \
  --type photo \
  --asset_hint 1x

GET /v2/images/collections/featured Try it out

This endpoint lists featured collections of specific types and a name and cover image for each collection.

Parameters

Parameter Type Description
asset_hint string

Cover image size

Default: 1x

Valid values: 1x, 2x

embed string

Which sharing information to include in the response, such as a URL to the collection

Valid values: share_url

type [string]

The types of collections to return

Valid values: photo, editorial, vector

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "total_item_count": 82,
      "items_updated_time": "2021-07-08T12:33:37.000Z",
      "name": "Exercise & Fitness",
      "id": "19853",
      "created_time": "2021-07-07T13:10:24.000Z",
      "updated_time": "2021-07-07T13:10:24.000Z",
      "cover_item": {
        "url": "https://ak.picdn.net/assets/cms/b467415246debdab45825d915a548f8f79b57882-Collection_1_Thumnail.jpg"
      }
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

Responses

Status Description Schema
200 OK FeaturedCollectionDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
curl -X GET "https://api.shutterstock.com/v2/images/collections/featured/136351027" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

imagesApi.getFeaturedImageCollection("136351027")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections/featured/136351027",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-featured-image-collection 136351027

GET /v2/images/collections/featured/{id} Try it out

This endpoint gets more detailed information about a featured collection, including its cover image and timestamps for its creation and most recent update. To get the images, use GET /v2/images/collections/featured/{id}/items.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

asset_hint string

Cover image size

Default: 1x

Valid values: 1x, 2x

embed string

Which sharing information to include in the response, such as a URL to the collection

Valid values: share_url

Accepted authentication

Example responses

OK

{
  "total_item_count": 82,
  "items_updated_time": "2021-07-08T12:33:37.000Z",
  "name": "Exercise & Fitness",
  "id": "19853",
  "created_time": "2021-07-07T13:10:24.000Z",
  "updated_time": "2021-07-07T13:10:24.000Z",
  "cover_item": {
    "url": "https://ak.picdn.net/assets/cms/b467415246debdab45825d915a548f8f79b57882-Collection_1_Thumnail.jpg"
  }
}

Responses

Status Description Schema
200 OK FeaturedCollection
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Featured collection not found None
curl -X GET "https://api.shutterstock.com/v2/images/collections/featured/136351027/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

imagesApi.getFeaturedImageCollectionItems("136351027")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images/collections/featured/136351027/items",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock images get-featured-image-collection-items 136351027

GET /v2/images/collections/featured/{id}/items Try it out

This endpoint lists the IDs of images in a featured collection and the date that each was added.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 150

Default: 100

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1690105108",
      "added_time": "2021-07-08T12:33:37.000Z",
      "media_type": "image"
    },
    {
      "id": "1468703072",
      "added_time": "2021-07-08T12:31:43.000Z",
      "media_type": "image"
    }
  ],
  "page": 1,
  "per_page": 2,
  "total_count": 82
}

Responses

Status Description Schema
200 OK CollectionItemDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Featured collection not found None

Videos

Search for videos

curl -X GET "https://api.shutterstock.com/v2/videos/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=hot air balloon" \
  --data-urlencode "duration_from=30" \
  --data-urlencode "sort=popular"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "query": "hot air balloon",
  "duration_from": 30,
  "sort": "popular"
};

videosApi.searchVideos(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "query" => "hot air balloon",
  "duration_from" => 30,
  "sort" => "popular"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos search-videos \
  --query "hot air balloon" \
  --duration-from 30 \
  --sort popular

GET /v2/videos/search Try it out

This endpoint searches for videos. If you specify more than one search parameter, the API uses an AND condition. Array parameters can be specified multiple times; in this case, the API uses an AND or an OR condition with those values, depending on the parameter. You can also filter search terms out in the query parameter by prefixing the term with NOT.

Parameters

Parameter Type Description
added_date string

Show videos added on the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
added_date_end string

Show videos added before the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
added_date_start string

Show videos added on or after the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
aspect_ratio string

Show videos with the specified aspect ratio

Valid values: 4_3, 16_9, nonstandard

category string

Show videos with the specified Shutterstock-defined category; specify a category name or ID

contributor [string]

Show videos with the specified artist names or IDs

contributor_country [string]

Show videos from contributors in one or more specified countries

Format: A two-character (ISO 3166 Alpha-2) country code
Example: US
duration_from integer

Show videos with the specified duration or longer in seconds

duration_to integer

Show videos with the specified duration or shorter in seconds

fps_from number

Show videos with the specified frames per second or more

fps_to number

Show videos with the specified frames per second or fewer

keyword_safe_search boolean

Hide results with potentially unsafe keywords

Default: true

language Language

Set query and result language (uses Accept-Language header if not set)

license [string]

Show only videos with the specified license or licenses

Default: [commercial]

Valid values: commercial, editorial

model [string]

Show videos with each of the specified models

page integer

Page number

Minimum: 1

Default: 1

people_age string

Show videos that feature people of the specified age range

Valid values: infants, children, teenagers, 20s, 30s, 40s, 50s, 60s, older

people_ethnicity [string]

Show videos with people of the specified ethnicities

Valid values: african, african_american, black, brazilian, chinese, caucasian, east_asian, hispanic, japanese, middle_eastern, native_american, pacific_islander, south_asian, southeast_asian, other

people_gender string

Show videos with people with the specified gender

Valid values: male, female, both

people_model_released boolean

Show only videos of people with a signed model release

people_number integer

Show videos with the specified number of people

Maximum: 4

per_page integer

Number of results per page

Maximum: 500

Default: 20

query string

One or more search terms separated by spaces; you can use NOT to filter out videos that match a term

resolution string

Show videos with the specified resolution

Valid values: 4k, standard_definition, high_definition

safe boolean

Enable or disable safe search

Default: true

sort string

Sort by one of these categories

Default: popular

Valid values: newest, popular, relevance, random

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

duration integer

(Deprecated; use duration_from and duration_to instead) Show videos with the specified duration in seconds

fps number

(Deprecated; use fps_from and fps_to instead) Show videos with the specified frames per second

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1033184651",
      "aspect": 1.778,
      "aspect_ratio": "16:9",
      "assets": {
        "thumb_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "thumb_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "preview_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "preview_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "thumb_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        },
        "preview_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        }
      },
      "contributor": {
        "id": "4411978"
      },
      "description": "Camera follows hipster millennial young woman in orange jacket running up on top of mountain summit at sunset, jumps on top of rocks, raises arms into air, happy and drunk on life, youth and happiness",
      "duration": 14.081,
      "has_model_release": true,
      "media_type": "video"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123,
  "search_id": "749090bb-2967-4a20-b22e-c800dc845e10"
}

Responses

Status Description Schema
200 OK VideoSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Not found None

Get suggestions for a search term

curl -X GET "https://api.shutterstock.com/v2/videos/search/suggestions" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=cats"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "query": "cats",
};

videosApi.getVideoSuggestions(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "query" => "cats"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/search/suggestions" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-video-suggestions \
  --query cats

GET /v2/videos/search/suggestions Try it out

This endpoint provides autocomplete suggestions for partial search terms.

Parameters

Parameter Type Description
query
(Required)
string

Search term for which you want keyword suggestions

limit integer

Limit the number of the suggestions

Minimum: 1

Maximum: 25

Default: 10

Accepted authentication

Example responses

OK

{
  "data": [
    "cat scan",
    "cats and dogs",
    "cats playing",
    "catsuit",
    "cat silhouette",
    "catskills",
    "cats eyes",
    "cat sitting",
    "cat sleeping",
    "cats eye"
  ]
}

Responses

Status Description Schema
200 OK Suggestions
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List similar videos

curl -X GET "https://api.shutterstock.com/v2/videos/2140697/similar" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "language=es"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "language": "es",
};

videosApi.findSimilarVideos("2140697", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "language" => "es"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/2140697/similar" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos find-similar-videos 2140697 \
  --language es

GET /v2/videos/{id}/similar Try it out

This endpoint searches for videos that are similar to a video that you specify.

Parameters

Parameter Type Description
id
(Required)
string

The ID of a video for which similar videos should be returned

Format: A Shutterstock asset ID that starts with a nonzero digit and has any number of other digits
Example: 18765466
language Language

Language for the keywords and categories in the response

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 500

Default: 20

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1033184651",
      "aspect": 1.778,
      "aspect_ratio": "16:9",
      "assets": {
        "thumb_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "thumb_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "preview_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "preview_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "thumb_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        },
        "preview_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        }
      },
      "contributor": {
        "id": "4411978"
      },
      "description": "Camera follows hipster millennial young woman in orange jacket running up on top of mountain summit at sunset, jumps on top of rocks, raises arms into air, happy and drunk on life, youth and happiness",
      "duration": 14.081,
      "has_model_release": true,
      "media_type": "video"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123,
  "search_id": "749090bb-2967-4a20-b22e-c800dc845e10"
}

Responses

Status Description Schema
200 OK VideoSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List updated videos

curl -X GET "https://api.shutterstock.com/v2/videos/updated "\
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "interval=30 MINUTE"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "interval": "30 MINUTE"
};

videosApi.getUpdatedVideos(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "interval" => "30 MINUTE"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/updated?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-updated-videos \
  --interval "30 MINUTE"

GET /v2/videos/updated Try it out

This endpoint lists videos that have been updated in the specified time period to update content management systems (CMS) or digital asset management (DAM) systems. In most cases, use the interval parameter to show videos that were updated recently, but you can also use the start_date and end_date parameters to specify a range of no more than three days. Do not use the interval parameter with either start_date or end_date.

Parameters

Parameter Type Description
end_date string

Show videos updated before the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
interval string

Show videos updated in the specified time period, where the time period is an interval (like SQL INTERVAL) such as 1 DAY, 6 HOUR, or 30 MINUTE; the default is 1 HOUR, which shows videos that were updated in the hour preceding the request

Default: 1 HOUR

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 2000

Default: 100

sort string

Sort by oldest or newest videos first

Default: newest

Valid values: newest, oldest

start_date string

Show videos updated on or after the specified date

Format: YYYY-MM-DD
Example: 2020-05-29

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "123456789",
      "updated_time": "2020-05-29T12:10:22-05:00",
      "updates": [
        "addition",
        "edit"
      ]
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 13
}

Responses

Status Description Schema
200 OK UpdatedMediaDataList

Details

List videos

curl -X GET "https://api.shutterstock.com/v2/videos" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "id=639703" \
  --data-urlencode "id=993721" \
  --data-urlencode "search_id=00000000-0000-0000-0000-000000000000"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "id": [
    "639703",
    "993721",
  ],
  "search_id": "00000000-0000-0000-0000-000000000000",
};

videosApi.getVideoList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$query = "id=639703&id=993721&search_id=00000000-0000-0000-0000-000000000000";

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos?$query",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-video-list \
  --id 639703 \
  --id 993721 \
  --search_id 00000000-0000-0000-0000-000000000000

GET /v2/videos Try it out

This endpoint lists information about one or more videos, including the aspect ratio and URLs to previews.

Parameters

Parameter Type Description
id
(Required)
[string]

One or more video IDs

Format: A Shutterstock asset ID that starts with a nonzero digit and has any number of other digits
Example: 18765466

Minimum length: 1

Maximum length: 500

search_id string

The ID of the search that is related to this request

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1033184651",
      "added_date": "2019-07-13",
      "aspect": 1.778,
      "aspect_ratio": "16:9",
      "assets": {
        "thumb_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "thumb_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "preview_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "preview_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "thumb_jpgs": {
          "urls": [
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/1.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/2.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/3.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/4.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/5.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/6.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/7.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/8.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/9.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/10.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/11.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
          ]
        },
        "thumb_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        },
        "preview_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        },
        "sd": {
          "height": 480,
          "width": 852,
          "fps": 29.97,
          "format": "mov",
          "file_size": 4577280,
          "display_name": "Standard Definition MPEG",
          "is_licensable": true
        },
        "web": {
          "height": 240,
          "width": 426,
          "fps": 29.97,
          "format": "mov",
          "file_size": 1291264,
          "display_name": "Low Resolution MPEG",
          "is_licensable": true
        },
        "hd": {
          "height": 1080,
          "width": 1920,
          "fps": 29.97,
          "format": "avc1",
          "file_size": 110359552,
          "display_name": "Original HD",
          "is_licensable": true
        }
      },
      "categories": [
        {
          "name": "Nature",
          "id": "12"
        },
        {
          "name": "People",
          "id": "13"
        }
      ],
      "contributor": {
        "id": "4411978"
      },
      "description": "Camera follows hipster millennial young woman in orange jacket running up on top of mountain summit at sunset, jumps on top of rocks, raises arms into air, happy and drunk on life, youth and happiness",
      "duration": 14.081,
      "has_model_release": true,
      "has_property_release": false,
      "is_adult": false,
      "is_editorial": false,
      "keywords": [
        "active",
        "activity",
        "adventure",
        "arms",
        "backpacker",
        "carefree",
        "celebrating",
        "cliff",
        "climate",
        "cloud",
        "discovery",
        "escape",
        "explore",
        "extreme",
        "free",
        "freedom",
        "girl",
        "happy",
        "high",
        "hiker",
        "hiking",
        "hill",
        "independent",
        "inspiration",
        "landscape",
        "leisure",
        "lifestyle",
        "mountain",
        "mountains",
        "nature",
        "outdoor",
        "peak",
        "person",
        "rock",
        "scenic",
        "sky",
        "sport",
        "success",
        "summer",
        "summit",
        "sun",
        "sunset",
        "top",
        "tourism",
        "travel",
        "trekking",
        "vacation",
        "view",
        "winning",
        "woman"
      ],
      "media_type": "video",
      "models": [
        {
          "id": "33233810"
        },
        {
          "id": "25487168"
        }
      ]
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 25
}

Responses

Status Description Schema
200 OK VideoDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get details about videos

curl -X GET "https://api.shutterstock.com/v2/videos/639703" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "language=es" \
  --data-urlencode "search_id=00000000-0000-0000-0000-000000000000"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "language": "es",
  "search_id": "00000000-0000-0000-0000-000000000000",
};

videosApi.getVideo("639703", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "language" => "es",
  "search_id" => "00000000-0000-0000-0000-000000000000"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/639703" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-video 639703 \
  --language es \
  --search_id 00000000-0000-0000-0000-000000000000

GET /v2/videos/{id} Try it out

This endpoint shows information about a video, including URLs to previews and the sizes that it is available in.

Parameters

Parameter Type Description
id
(Required)
string

Video ID

Format: A Shutterstock asset ID that starts with a nonzero digit and has any number of other digits
Example: 18765466
language Language

Language for the keywords and categories in the response

search_id string

The ID of the search that is related to this request

view string

Amount of detail to render in the response

Default: full

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "id": "1033184651",
  "added_date": "2019-07-13",
  "aspect": 1.778,
  "aspect_ratio": "16:9",
  "assets": {
    "thumb_webm": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
    },
    "thumb_mp4": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
    },
    "preview_webm": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
    },
    "preview_mp4": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
    },
    "thumb_jpgs": {
      "urls": [
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/1.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/2.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/3.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/4.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/5.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/6.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/7.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/8.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/9.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/10.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/11.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
      ]
    },
    "thumb_jpg": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
    },
    "preview_jpg": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
    },
    "sd": {
      "height": 480,
      "width": 852,
      "fps": 29.97,
      "format": "mov",
      "file_size": 4577280,
      "display_name": "Standard Definition MPEG",
      "is_licensable": true
    },
    "web": {
      "height": 240,
      "width": 426,
      "fps": 29.97,
      "format": "mov",
      "file_size": 1291264,
      "display_name": "Low Resolution MPEG",
      "is_licensable": true
    },
    "hd": {
      "height": 1080,
      "width": 1920,
      "fps": 29.97,
      "format": "avc1",
      "file_size": 110359552,
      "display_name": "Original HD",
      "is_licensable": true
    }
  },
  "categories": [
    {
      "name": "Nature",
      "id": "12"
    },
    {
      "name": "People",
      "id": "13"
    }
  ],
  "contributor": {
    "id": "4411978"
  },
  "description": "Camera follows hipster millennial young woman in orange jacket running up on top of mountain summit at sunset, jumps on top of rocks, raises arms into air, happy and drunk on life, youth and happiness",
  "duration": 14.081,
  "has_model_release": true,
  "has_property_release": false,
  "is_adult": false,
  "is_editorial": false,
  "keywords": [
    "active",
    "activity",
    "adventure",
    "arms",
    "backpacker",
    "carefree",
    "celebrating",
    "cliff",
    "climate",
    "cloud",
    "discovery",
    "escape",
    "explore",
    "extreme",
    "free",
    "freedom",
    "girl",
    "happy",
    "high",
    "hiker",
    "hiking",
    "hill",
    "independent",
    "inspiration",
    "landscape",
    "leisure",
    "lifestyle",
    "mountain",
    "mountains",
    "nature",
    "outdoor",
    "peak",
    "person",
    "rock",
    "scenic",
    "sky",
    "sport",
    "success",
    "summer",
    "summit",
    "sun",
    "sunset",
    "top",
    "tourism",
    "travel",
    "trekking",
    "vacation",
    "view",
    "winning",
    "woman"
  ],
  "media_type": "video",
  "models": [
    {
      "id": "33233810"
    },
    {
      "id": "25487168"
    }
  ]
}

Responses

Status Description Schema
200 OK Video
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Not found None

List video categories

curl -X GET "https://api.shutterstock.com/v2/videos/categories" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "language=es"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "language": "es",
};

videosApi.listVideoCategories(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "language" => "es"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/categories" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos list-video-categories \
  --language es

GET /v2/videos/categories Try it out

This endpoint lists the categories (Shutterstock-assigned genres) that videos can belong to.

Parameters

Parameter Type Description
language Language

Language for the keywords and categories in the response

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1",
      "name": "Animals/Wildlife"
    },
    {
      "id": "11",
      "name": "The Arts"
    }
  ],
  "page": 1,
  "per_page": 2,
  "total_count": 13
}

Responses

Status Description Schema
200 OK CategoryDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Licenses And Downloads

License videos

DATA='{
  "videos": [
    {
      "video_id": "2140697",
      "subscription_id": "s12345678",
      "size": "hd"
    },
    {
      "video_id": "5613314",
      "subscription_id": "s12345678",
      "size": "4k"
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/videos/licenses" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const body = {
  "videos": [
    {
      "subscription_id": "s12345678",
      "video_id": "419235589"
    },
    {
      "subscription_id": "s12345678",
      "video_id": "1079756147"
    }
  ]
};

videosApi.licenseVideos(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "videos" => [
    [
      "video_id" => "2140697",
      "subscription_id" => "s12345678",
      "size" => "hd"
    ],
    [
      "video_id" => "5613314",
      "subscription_id" => "s12345678",
      "size" => "4k"
    ]
  ]
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/licenses",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "videos": [
    {
      "video_id": "2140697",
      "subscription_id": "s12345678",
      "size": "hd"
    },
    {
      "video_id": "5613314",
      "subscription_id": "s12345678",
      "size": "4k"
    }
  ]
}' > data.json

shutterstock videos license-videos \
  data.json

POST /v2/videos/licenses Try it out

This endpoint gets licenses for one or more videos. You must specify the video IDs in the body parameter and the size and subscription ID either in the query parameter or with each video ID in the body parameter. Values in the body parameter override values in the query parameters. The download links in the response are valid for 8 hours.

Parameters

Parameter Type Description
search_id string

The Search ID that led to this licensing event

size string

The size of the video to license

Default: web

Valid values: web, sd, hd, 4k

subscription_id string

The subscription ID to use for licensing

Body

Schema: LicenseVideoRequest

List of videos to request licenses for and information about each license transaction; these values override the defaults in the query parameters

Field Type Description
videos
(Required)
[LicenseVideo]

Videos to license

Maximum length: 50

video_id
(Required)
string

ID of the video being licensed

auth_cookie Cookie

Cookie object

name
(Required)
string

The name of the cookie

value
(Required)
string

The value of the cookie

editorial_acknowledgement boolean

Whether or not this item is editorial content

metadata LicenseRequestMetadata

Additional information for license requests for enterprise accounts and API subscriptions, 4 fields maximum; which fields are required is set by the account holder

price number

Retail price amount as a floating-point number in the transaction currency, such as 12.34; only for rev-share partners

search_id string

ID of the search that led to this licensing event

size string

Size of the video being licensed

Valid values: web, sd, hd, 4k

subscription_id string

ID of the subscription used for this license

show_modal boolean

(Deprecated)

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "allotment_charge": 1,
      "download": {
        "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.mp4"
      },
      "price": {
        "local_amount": 12.34,
        "local_currency": "EUR"
      },
      "video_id": "123456789"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

Responses

Status Description Schema
200 OK LicenseVideoResultDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List video licenses

curl -X GET "https://api.shutterstock.com/v2/videos/licenses" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  -G \
  --data-urlencode "start_date=2016-10-03T01:25:13.521Z" \
  --data-urlencode "end_date=2016-10-04T13:25:13.521Z" \
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "start_date": "2016-10-03T01:25:13.521Z",
  "end_date": "2016-10-04T13:25:13.521Z"
};

videosApi.getVideoLicenseList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "start_date" => "2016-10-03T01:25:13.521Z",
  "end_date" => "2016-10-04T13:25:13.521Z"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/licenses" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-video-license-list \
  --start-date "2021-01-03T01:25:13.521Z" \
  --end-date "2021-05-04T13:25:13.521Z"

GET /v2/videos/licenses Try it out

This endpoint lists existing licenses.

Parameters

Parameter Type Description
download_availability string

Filter licenses by download availability

Default: all

Valid values: all, downloadable, non_downloadable

end_date string

Show licenses created before the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

Must be > than start_date

license string

Show videos that are available with the specified license, such as standard or enhanced

Format: /^.+$/ (Minimum 1 character)

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 200

Default: 20

sort string

Sort by oldest or newest videos first

Default: newest

Valid values: newest, oldest

start_date string

Show licenses created on or after the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

Must be <= than end_date

team_history boolean

Set to true to see license history for all members of your team.

username string

Filter licenses by username of licensee

video_id string

Show licenses for the specified video ID

Format: /^[1-9]\d*$/ (A number that does not start with 0)

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "e121",
      "user": {
        "username": "myusername"
      },
      "license": "footage_premier",
      "subscription_id": "s12345678",
      "download_time": "2018-05-24T14:26:25-04:00",
      "is_downloadable": true,
      "metadata": {
        "customer_id": "12345",
        "geo_location": "US",
        "number_viewed": "15",
        "search_term": "dog"
      },
      "video": {
        "id": "2140697",
        "format": {
          "size": "sd"
        }
      }
    }
  ],
  "page": 1,
  "per_page": 20
}

Responses

Status Description Schema
200 OK DownloadHistoryDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Download videos

DATA='{}'

curl -X POST "https://api.shutterstock.com/v2/videos/licenses/e123/downloads" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const licenseId = "e123";

const body = {};

videosApi.downloadVideos(licenseId, body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/licenses/e123/downloads",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{}' > data.json

shutterstock videos download-videos e123 data.json

POST /v2/videos/licenses/{id}/downloads Try it out

This endpoint redownloads videos that you have already received a license for.

Parameters

Parameter Type Description
id
(Required)
string

The license ID of the item to (re)download. The download links in the response are valid for 8 hours.

Body

Schema: RedownloadVideo

Information about the videos to redownload

Field Type Description
size string

Size of the video

Valid values: web, sd, hd, 4k

auth_cookie Cookie

(Deprecated)

name
(Required)
string

The name of the cookie

value
(Required)
string

The value of the cookie

show_modal boolean

(Deprecated)

verification_code string

(Deprecated)

Accepted authentication

Example responses

OK

{
  "url": "https://download1.shutterstock.com/gatekeeper/W3siZSI6MTUzMzMzMzUzMCwiayI6InZpZGVvLzM5NjU4ODEvaGQubW92IiwibSI6MSwiZCI6InNodXR0ZXJzdG9jay1tZWRpYSJ9LCJjZ2lvRU14T09hNWZGTHZsN21iTWVPRVQ3MFEiXQ/shutterstock_v3965881.mov"
}

Responses

Status Description Schema
200 OK Url
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Collections

Create video collections

DATA='{
  "name": "New collection name"
}'

curl -X POST "https://api.shutterstock.com/v2/videos/collections" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const body = {
  "name": "New collection name"
};

videosApi.createVideoCollection(body)
  .catch((error) => {
    console.error(error);
  });
$body = [
  "name" => "New collection name"
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "name": "New collection name"
}' > data.json

shutterstock videos create-video-collection data.json

POST /v2/videos/collections Try it out

This endpoint creates one or more collections (clipboxes). To add videos to collections, use POST /v2/videos/collections/{id}/items.

Parameters

None.

Body

Schema: CollectionCreateRequest

Collection metadata

Field Type Description
name
(Required)
string

The name of the collection

Accepted authentication

Example responses

Successfully created video collection

{
  "id": "48433105"
}

Responses

Status Description Schema
201 Successfully created video collection CollectionCreateResponse
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List video collections

curl -X GET "https://api.shutterstock.com/v2/videos/collections" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "embed=share_code"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "embed": "share_code",
};

videosApi.getVideoCollectionList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "embed" => "share_code"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-video-collection-list \
  --embed share_code

GET /v2/videos/collections Try it out

This endpoint lists your collections of videos and their basic attributes.

Parameters

Parameter Type Description
embed [string]

Which sharing information to include in the response, such as a URL to the collection

Valid values: share_code, share_url

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 150

Default: 100

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "293542904",
      "name": "My collection",
      "total_item_count": 85,
      "items_updated_time": "2021-05-20T16:15:22-04:00",
      "cover_item": {
        "id": "297886754"
      }
    }
  ],
  "page": 1,
  "per_page": 100,
  "total_count": 1
}

Responses

Status Description Schema
200 OK CollectionDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get the details of video collections

curl -X GET "https://api.shutterstock.com/v2/videos/collections/17555176" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

videosApi.getVideoCollection("17555176")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections/17555176",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-video-collection 17555176

GET /v2/videos/collections/{id} Try it out

This endpoint gets more detailed information about a collection, including the timestamp for its creation and the number of videos in it. To get the videos in collections, use GET /v2/videos/collections/{id}/items.

Parameters

Parameter Type Description
id
(Required)
string

The ID of the collection to return

embed [string]

Which sharing information to include in the response, such as a URL to the collection

Valid values: share_code, share_url

share_code string

Code to retrieve a shared collection

Accepted authentication

Example responses

OK

{
  "id": "293542904",
  "name": "My collection",
  "total_item_count": 85,
  "items_updated_time": "2021-05-20T16:15:22-04:00",
  "cover_item": {
    "id": "297886754"
  }
}

Responses

Status Description Schema
200 OK Collection
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Rename video collections

DATA='{
  "name": "Updated collection name"
}'

curl -X POST "https://api.shutterstock.com/v2/videos/collections/17555176" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const collectionId = "186765119";

const body = {
  "name": "My new collection name"
};

videosApi.renameVideoCollection(collectionId, body)
  .catch((error) => {
    console.error(error);
  });
$body = [
  "name" => "Updated collection name"
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections/17555176",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "name": "Updated collection name"
}' > data.json

shutterstock videos rename-video-collection 17555176 data.json

POST /v2/videos/collections/{id} Try it out

This endpoint sets a new name for a collection.

Parameters

Parameter Type Description
id
(Required)
string

The ID of the collection to rename

Body

Schema: CollectionUpdateRequest

The new name for the collection

Field Type Description
name
(Required)
string

The new name of the collection

Accepted authentication

Responses

Status Description Schema
204 Successfully updated collection None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Delete video collections

curl -X DELETE "https://api.shutterstock.com/v2/videos/collections/17555176" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const collectionId = "17555176";

videosApi.deleteVideoCollection(collectionId)
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections/17555176",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos delete-video-collection 17555176

DELETE /v2/videos/collections/{id} Try it out

This endpoint deletes a collection.

Parameters

Parameter Type Description
id
(Required)
string

The ID of the collection to delete

Accepted authentication

Responses

Status Description Schema
204 Successfully deleted collection None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Add videos to collections

DATA='{
  "items": [
    {
      "id": "10120264"
    },
    {
      "id": "24419024"
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/videos/collections/17555176/items" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const collectionId = "17555176"; // Collection ID

// Array of videos to add
const body = {
  "items": [
    {
      "id": "10120264",
      "media_type": "video"
    }
  ]
};

videosApi.addImageCollectionItems(collectionId, body)
  .catch((error) => {
    console.error(error);
  });
$body = [
  "items" => [
    [
      "id" => "10120264"
    ],
    [
      "id" => "24419024"
    ]
  ]
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections/17555176/items",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "items": [
    {
      "id": "10120264"
    },
    {
      "id": "24419024"
    }
  ]
}' > data.json

shutterstock videos add-video-collection-items 17555176 data.json

POST /v2/videos/collections/{id}/items Try it out

This endpoint adds one or more videos to a collection by video IDs.

Parameters

Parameter Type Description
id
(Required)
string

The ID of the collection to which items should be added

Body

Schema: CollectionItemRequest

Array of video IDs to add to the collection

Field Type Description
items
(Required)
[CollectionItem]

List of items

id
(Required)
string

ID of the item

added_time string

The date the item was added to the collection
Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

media_type string

The media type of the item, such as image, video, or audio

Accepted authentication

Responses

Status Description Schema
204 Successfully added collection items None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Get the contents of video collections

curl -X GET "https://api.shutterstock.com/v2/videos/collections/17555176/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

videosApi.getVideoCollectionItems("17555176")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections/17555176/items",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-video-collection-items 17555176

GET /v2/videos/collections/{id}/items Try it out

This endpoint lists the IDs of videos in a collection and the date that each was added.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 150

Default: 100

share_code string

Code to retrieve the contents of a shared collection

sort string

Sort order

Default: oldest

Valid values: newest, oldest

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1690105108",
      "added_time": "2021-07-08T12:33:37.000Z",
      "media_type": "image"
    },
    {
      "id": "1468703072",
      "added_time": "2021-07-08T12:31:43.000Z",
      "media_type": "image"
    }
  ],
  "page": 1,
  "per_page": 2,
  "total_count": 82
}

Responses

Status Description Schema
200 OK CollectionItemDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Remove videos from collections

curl -X DELETE "https://api.shutterstock.com/v2/videos/collections/17555176/items?item_id=495863218" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const collectionId = "17555176";

// Array of videos to remove
const videosToRemove = {
  "item_id": [
    "10120264"
  ]
};

videosApi.deleteVideoCollectionItems(collectionId, videosToRemove)
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections/17555176/items?item_id=495863218",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_CUSTOMREQUEST => "DELETE",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos delete-video-collection-items 17555176 \
  --item-id 495863218

DELETE /v2/videos/collections/{id}/items Try it out

This endpoint removes one or more videos from a collection.

Parameters

Parameter Type Description
id
(Required)
string

The ID of the Collection from which items will be deleted

item_id [string]

One or more video IDs to remove from the collection

Accepted authentication

Responses

Status Description Schema
204 Successfully removed collection items None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None
curl -X GET "https://api.shutterstock.com/v2/videos/collections/featured" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "embed=share_url"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

const queryParams = {
  "embed": "share_url",
};

videosApi.getFeaturedVideoCollectionList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "embed" => "share_url"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections/featured" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-featured-video-collection-list \
  --embed share_url

GET /v2/videos/collections/featured Try it out

This endpoint lists featured video collections and a name and cover video for each collection.

Parameters

Parameter Type Description
embed string

What information to include in the response, such as a URL to the collection

Valid values: share_url

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "total_item_count": 82,
      "items_updated_time": "2021-07-08T12:33:37.000Z",
      "name": "Exercise & Fitness",
      "id": "19853",
      "created_time": "2021-07-07T13:10:24.000Z",
      "updated_time": "2021-07-07T13:10:24.000Z",
      "cover_item": {
        "url": "https://ak.picdn.net/assets/cms/b467415246debdab45825d915a548f8f79b57882-Collection_1_Thumnail.jpg"
      }
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

Responses

Status Description Schema
200 OK FeaturedCollectionDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
curl -X GET "https://api.shutterstock.com/v2/videos/collections/featured/136351027" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

videosApi.getFeaturedVideoCollection("136351027")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections/featured/136351027",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-featured-video-collection 136351027

GET /v2/videos/collections/featured/{id} Try it out

This endpoint gets more detailed information about a featured video collection, including its cover video and timestamps for its creation and most recent update. To get the videos, use GET /v2/videos/collections/featured/{id}/items.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

embed string

What information to include in the response, such as a URL to the collection

Valid values: share_url

Accepted authentication

Example responses

OK

{
  "total_item_count": 82,
  "items_updated_time": "2021-07-08T12:33:37.000Z",
  "name": "Exercise & Fitness",
  "id": "19853",
  "created_time": "2021-07-07T13:10:24.000Z",
  "updated_time": "2021-07-07T13:10:24.000Z",
  "cover_item": {
    "url": "https://ak.picdn.net/assets/cms/b467415246debdab45825d915a548f8f79b57882-Collection_1_Thumnail.jpg"
  }
}

Responses

Status Description Schema
200 OK FeaturedCollection
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Featured collection not found None
curl -X GET "https://api.shutterstock.com/v2/videos/collections/featured/136351027/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const videosApi = new sstk.VideosApi();

videosApi.getFeaturedVideoCollectionItems("136351027")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/videos/collections/featured/136351027/items",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock videos get-featured-video-collection-items 136351027

GET /v2/videos/collections/featured/{id}/items Try it out

This endpoint lists the IDs of videos in a featured collection and the date that each was added.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 150

Default: 100

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "added_time": "2016-08-18T18:52:59-04:00",
      "id": "76688182",
      "media_type": "video"
    },
    {
      "added_time": "2016-08-18T18:52:59-04:00",
      "id": "40005859",
      "media_type": "video"
    }
  ],
  "page": 1,
  "per_page": 100
}

Responses

Status Description Schema
200 OK VideoCollectionItemDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Featured collection not found None

Audio

Search for tracks

curl -X GET "https://api.shutterstock.com/v2/audio/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=bluegrass" \
  --data-urlencode "duration_from=60" \
  --data-urlencode "moods=uplifting"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const queryParams = {
  "query": "bluegrass",
  "duration_from": 60,
  "moods": ["uplifting"]
};

audioApi.searchTracks(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "query" => "bluegrass",
  "duration_from" => 60,
  "moods" => "uplifting"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio search-tracks \
  --query bluegrass \
  --duration-from 60 \
  --moods uplifting

GET /v2/audio/search Try it out

This endpoint searches for tracks. If you specify more than one search parameter, the API uses an AND condition. Array parameters can be specified multiple times; in this case, the API uses an AND or an OR condition with those values, depending on the parameter.

Parameters

Parameter Type Description
artists [string]

Show tracks with one of the specified artist names or IDs

bpm_from integer

Show tracks with the specified beats per minute or faster

bpm_to integer

Show tracks with the specified beats per minute or slower

duration integer

Show tracks with the specified duration in seconds

duration_from integer

Show tracks with the specified duration or longer in seconds

duration_to integer

Show tracks with the specified duration or shorter in seconds

fields string

Fields to display in the response; see the documentation for the fields parameter in the overview section

genre [string]

Show tracks with each of the specified genres; to get the list of genres, use GET /v2/audio/genres

instruments [string]

Show tracks with each of the specified instruments; to get the list of instruments, use GET /v2/audio/instruments

is_instrumental boolean

Show instrumental music only

language string

Which language to search in

library string

Which library to search

Default: premier

Valid values: shutterstock, premier

moods [string]

Show tracks with each of the specified moods; to get the list of moods, use GET /v2/audio/moods

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Maximum: 500

Default: 20

query string

One or more search terms separated by spaces

sort string

Sort by

Valid values: score, ranking_all, artist, title, bpm, freshness, duration

sort_order string

Sort order

Default: desc

Valid values: asc, desc

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

vocal_description string

Show tracks with the specified vocal description (male, female)

bpm integer

(Deprecated; use bpm_from and bpm_to instead) Show tracks with the specified beats per minute

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "added_date": "2016-08-16",
      "artists": [
        {
          "name": "Klimenko Music"
        }
      ],
      "assets": {
        "clean_audio": {
          "file_size": 35188408
        },
        "preview_mp3": {
          "file_size": 4400203,
          "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.mp3"
        },
        "preview_ogg": {
          "file_size": 4453197,
          "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.ogg"
        },
        "waveform": {
          "file_size": 18778,
          "url": "https://ak.picdn.net/shutterstock/audio/442583/waveform/waveform.png"
        }
      },
      "bpm": 110,
      "contributor": {
        "id": "2847971"
      },
      "description": "Pulsing and feel-good, featuring soaring synthesizer, groovy synth bass drums and synth drums that create a euphoric, upbeat mood.",
      "duration": 183,
      "genres": [
        "Dance/Electronic",
        "Electro Pop",
        "Pop/Rock"
      ],
      "id": "442583",
      "instruments": [
        "Piano",
        "Synth bass",
        "Synth drums",
        "Synthesizer"
      ],
      "is_adult": false,
      "is_instrumental": true,
      "isrc": "",
      "keywords": [
        "celebratory",
        "chic",
        "euphoric",
        "good times",
        "hip",
        "optimistic",
        "party",
        "soaring",
        "upbeat"
      ],
      "language": "en",
      "lyrics": "",
      "media_type": "audio",
      "moods": [
        "Bright",
        "Confident",
        "Fun",
        "Happy",
        "Inspiring",
        "Optimistic",
        "Playful",
        "Sophisticated",
        "Stylish",
        "Uplifting"
      ],
      "published_time": "2016-08-16T14:30:03-04:00",
      "recording_version": "",
      "releases": [],
      "similar_artists": [],
      "title": "Another Tomorrow",
      "updated_time": "2016-08-18T17:59:33-04:00",
      "vocal_description": "",
      "url": ""
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455,
  "search_id": "749090bb-2967-4a20-b22e-c800dc845e10"
}

Responses

Status Description Schema
200 OK AudioSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List audio genres

curl -X GET "https://api.shutterstock.com/v2/audio/genres" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

audioApi.listGenres()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/genres",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio list-genres

GET /v2/audio/genres Try it out

This endpoint returns a list of all audio genres.

Parameters

Parameter Type Description
language string

Which language the genres will be returned

Accepted authentication

Example responses

OK

{
  "data": [
    "Rock",
    "Pop > Singer-Songwriter",
    "Pop > Synth Pop",
    "Production / Film Scores"
  ]
}

Responses

Status Description Schema
200 OK GenreList

List audio instruments

curl -X GET "https://api.shutterstock.com/v2/audio/instruments" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

audioApi.listInstruments()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/instruments",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio list-instruments

GET /v2/audio/instruments Try it out

This endpoint returns a list of all audio instruments.

Parameters

Parameter Type Description
language string

Which language the instruments will be returned in

Accepted authentication

Example responses

OK

{
  "data": [
    "Orchestra",
    "Organ",
    "Oud",
    "Pads",
    "Electric Guitar"
  ]
}

Responses

Status Description Schema
200 OK InstrumentList

List audio moods

curl -X GET "https://api.shutterstock.com/v2/audio/moods" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

audioApi.listMoods()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/moods",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio list-moods

GET /v2/audio/moods Try it out

This endpoint returns a list of all audio moods.

Parameters

Parameter Type Description
language string

Which language the moods will be returned in

Accepted authentication

Example responses

OK

{
  "data": [
    "Action / Sports",
    "Adventure / Discovery",
    "Aerobics / Workout",
    "Aggressive"
  ]
}

Responses

Status Description Schema
200 OK MoodList

Details

List audio tracks

curl -X GET "https://api.shutterstock.com/v2/audio" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "id=442583" \
  --data-urlencode "id=434750" \
  --data-urlencode "view=full" \
  --data-urlencode "search_id=00000000-0000-0000-0000-000000000000"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const queryParams = {
  "id": [
    "442583",
    "434750",
  ],
  "view": "full",
  "search_id": "00000000-0000-0000-0000-000000000000",
};

audioApi.getTrackList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$query = "id=442583&id=434750&view=full&search_id=00000000-0000-0000-0000-000000000000";

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio?$query",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio get-track-list \
  --id 442583 \
  --id 434750 \
  --view full \
  --search_id 00000000-0000-0000-0000-000000000000

GET /v2/audio Try it out

This endpoint lists information about one or more audio tracks, including the description and publication date.

Parameters

Parameter Type Description
id
(Required)
[string]

One or more audio IDs

Minimum length: 1

Maximum length: 500

Format: /^[1-9]\d*$/ (A number that does not start with 0)

search_id string

The ID of the search that is related to this request

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "added_date": "2016-04-12",
      "artists": [
        {
          "name": "Fin Productions"
        }
      ],
      "assets": {
        "clean_audio": {
          "file_size": 30760372
        },
        "preview_mp3": {
          "file_size": 3846606,
          "url": "https://ak.picdn.net/shutterstock/audio/434750/preview/preview.mp3"
        },
        "preview_ogg": {
          "file_size": 4402608,
          "url": "https://ak.picdn.net/shutterstock/audio/434750/preview/preview.ogg"
        },
        "waveform": {
          "file_size": 19822,
          "url": "https://ak.picdn.net/shutterstock/audio/434750/waveform/waveform.png"
        }
      },
      "bpm": 100,
      "contributor": {
        "id": "2847971"
      },
      "description": "Pulsing and feel-good, featuring slick electric guitar, synthesizer, bass, electronic drum pads and drums that create a positive, celebratory mood.",
      "duration": 160,
      "genres": [
        "Dance/Electronic",
        "Electro Pop",
        "Pop/Rock"
      ],
      "id": "434750",
      "instruments": [
        "Bass",
        "Drums",
        "Electric guitar",
        "Pads",
        "Percussion",
        "Synthesizer"
      ],
      "is_adult": false,
      "is_instrumental": true,
      "isrc": "",
      "keywords": [
        "breezy",
        "celebration",
        "festive",
        "good times",
        "hopeful",
        "optimistic",
        "party",
        "positive",
        "reflective"
      ],
      "language": "en",
      "lyrics": "",
      "media_type": "audio",
      "moods": [
        "Bright",
        "Confident",
        "Fun",
        "Happy",
        "Inspiring",
        "Optimistic",
        "Playful",
        "Sophisticated",
        "Stylish",
        "Uplifting"
      ],
      "published_time": "2016-04-12T17:45:29-04:00",
      "recording_version": "",
      "releases": [],
      "similar_artists": [],
      "title": "Fresh Love",
      "updated_time": "2016-08-18T18:03:11-04:00",
      "vocal_description": ""
    }
  ]
}

Responses

Status Description Schema
200 OK AudioDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get details about audio tracks

curl -X GET "https://api.shutterstock.com/v2/audio/442583" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "view=full" \
  --data-urlencode "search_id=00000000-0000-0000-0000-000000000000"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const queryParams = {
  "view": "full",
  "search_id": "00000000-0000-0000-0000-000000000000",
};

audioApi.getTrack("442583", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "view" => "full",
  "search_id" => "00000000-0000-0000-0000-000000000000"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/442583" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio get-track 442583 \
  --view full \
  --search_id 00000000-0000-0000-0000-000000000000

GET /v2/audio/{id} Try it out

This endpoint shows information about a track, including its genres, instruments, and other attributes.

Parameters

Parameter Type Description
id
(Required)
integer

Audio track ID

search_id string

The ID of the search that is related to this request

view string

Amount of detail to render in the response

Default: full

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "added_date": "2016-08-16",
  "artists": [
    {
      "name": "Klimenko Music"
    }
  ],
  "assets": {
    "clean_audio": {
      "file_size": 35188408
    },
    "preview_mp3": {
      "file_size": 4400203,
      "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.mp3"
    },
    "preview_ogg": {
      "file_size": 4453197,
      "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.ogg"
    },
    "waveform": {
      "file_size": 18778,
      "url": "https://ak.picdn.net/shutterstock/audio/442583/waveform/waveform.png"
    }
  },
  "bpm": 110,
  "contributor": {
    "id": "2847971"
  },
  "description": "Pulsing and feel-good, featuring soaring synthesizer, groovy synth bass drums and synth drums that create a euphoric, upbeat mood.",
  "duration": 183,
  "genres": [
    "Dance/Electronic",
    "Electro Pop",
    "Pop/Rock"
  ],
  "id": "442583",
  "instruments": [
    "Piano",
    "Synth bass",
    "Synth drums",
    "Synthesizer"
  ],
  "is_adult": false,
  "is_instrumental": true,
  "isrc": "",
  "keywords": [
    "celebratory",
    "chic",
    "euphoric",
    "good times",
    "hip",
    "optimistic",
    "party",
    "soaring",
    "upbeat"
  ],
  "language": "en",
  "lyrics": "",
  "media_type": "audio",
  "moods": [
    "Bright",
    "Confident",
    "Fun",
    "Happy",
    "Inspiring",
    "Optimistic",
    "Playful",
    "Sophisticated",
    "Stylish",
    "Uplifting"
  ],
  "published_time": "2016-08-16T14:30:03-04:00",
  "recording_version": "",
  "releases": [],
  "similar_artists": [],
  "title": "Another Tomorrow",
  "updated_time": "2016-08-18T17:59:33-04:00",
  "vocal_description": "",
  "url": ""
}

Responses

Status Description Schema
200 OK Audio
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Licenses And Downloads

License audio tracks

DATA='{
  "audio": [
    {
      "audio_id": "591623",
      "license": "audio_platform",
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/audio/licenses" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const body = {
  "audio": [
    {
      "audio_id": "446348",
      "license": "audio_platform",
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
};

audioApi.licenseTrack(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "audio" => [
    [
      "audio_id" => "591623",
      "license" => "audio_platform",
      "metadata" => [
      "customer_id" => "12345"
      ]
    ]
  ]
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/licenses",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "audio": [
    {
      "audio_id": "591623",
      "license": "audio_platform",
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
}' > data.json

shutterstock audio license-track data.json

POST /v2/audio/licenses Try it out

This endpoint gets licenses for one or more tracks. The download links in the response are valid for 8 hours.

Parameters

Parameter Type Description
license string

License type

Valid values: audio_platform, premier_music_basic, premier_music_extended, premier_music_pro, premier_music_comp, asset_all_music

search_id string

The ID of the search that led to licensing this track

Body

Schema: LicenseAudioRequest

Tracks to license

Field Type Description
audio
(Required)
[LicenseAudio]

List of audio tracks to license

Maximum length: 50

audio_id
(Required)
string

ID of the track being licensed

license string

Type of license

Valid values: audio_platform, premier_music_basic, premier_music_extended, premier_music_pro, premier_music_comp, asset_all_music

search_id string

ID of the search that led to this licensing event

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "audio_id": "123456789",
      "download": {
        "url": "http://download2.dev.shutterstock.com/gatekeeper/abc/original.wav"
      },
      "license_id": "abcdef123456789ghijklmn",
      "allotment_charge": 1
    }
  ]
}

Responses

Status Description Schema
200 OK LicenseAudioResultDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List audio licenses

curl -X GET "https://api.shutterstock.com/v2/audio/licenses" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  -G \
  --data-urlencode "start_date=2016-10-03T01:25:13.521Z" \
  --data-urlencode "end_date=2016-10-04T13:25:13.521Z" \
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const queryParams = {
  "start_date": "2016-10-03T01:25:13.521Z",
  "end_date": "2016-10-04T13:25:13.521Z"
};

audioApi.getTrackLicenseList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "start_date" => "2016-10-03T01:25:13.521Z",
  "end_date" => "2016-10-04T13:25:13.521Z"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/licenses" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio get-track-license-list \
  --start-date "2016-10-03T01:25:13.521Z" \
  --end-date "2016-10-04T13:25:13.521Z"

GET /v2/audio/licenses Try it out

This endpoint lists existing licenses. You can filter the results according to the track ID to see if you have an existing license for a specific track.

Parameters

Parameter Type Description
audio_id string

Show licenses for the specified track ID

download_availability string

Filter licenses by download availability

Default: all

Valid values: all, downloadable, non_downloadable

end_date string

Show licenses created before the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

Must be > than start_date

license string

Restrict results by license.

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Maximum: 200

Default: 20

sort string

Sort order

Default: newest

Valid values: newest, oldest

start_date string

Show licenses created on or after the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

Must be <= than end_date

team_history boolean

Set to true to see license history for all members of your team.

username string

Filter licenses by username of licensee

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "a10b7a7a5a02113a928f13e5ba196151d6",
      "user": {
        "username": "jsmith"
      },
      "license": "premier_music_extended",
      "download_time": "2020-11-11T16:15:20.000Z",
      "metadata": {
        "purchase_order": "123"
      },
      "is_downloadable": true,
      "audio": {
        "id": "420298",
        "format": {
          "size": "clean_audio"
        }
      }
    }
  ],
  "page": 1,
  "per_page": 20,
  "total_count": 1
}

Responses

Status Description Schema
200 OK DownloadHistoryDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Download audio tracks

curl -X POST "https://api.shutterstock.com/v2/audio/licenses/e123/downloads" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const licenseId = "e123"; // license ID, not track ID

audioApi.downloadTracks(licenseId)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/licenses/e123/downloads",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio download-tracks e123

POST /v2/audio/licenses/{id}/downloads Try it out

This endpoint redownloads tracks that you have already received a license for. The download links in the response are valid for 8 hours.

Parameters

Parameter Type Description
id
(Required)
string

License ID

Accepted authentication

Example responses

OK

{
  "url": "http://download2.dev.shutterstock.com/gatekeeper/abc/original.wav",
  "shorts_loops_stems": "http://download2.dev.shutterstock.com/gatekeeper/abc/original.zip"
}

Responses

Status Description Schema
200 OK AudioUrl
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Collections

Create audio collections

DATA='{
  "name": "Best rock music"
}'

curl -X POST "https://api.shutterstock.com/v2/audio/collections" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const body = {
  "name": "Best rock music",
};

audioApi.createTrackCollection(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "name" => "Best rock music"
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/collections",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "name": "Best rock music"
}' > data.json

shutterstock images create-image-collection data.json

POST /v2/audio/collections Try it out

This endpoint creates one or more collections (soundboxes). To add tracks, use POST /v2/audio/collections/{id}/items.

Parameters

None.

Body

Schema: CollectionCreateRequest

Collection metadata

Field Type Description
name
(Required)
string

The name of the collection

Accepted authentication

Example responses

Successfully created audio collection

{
  "id": "48433105"
}

Responses

Status Description Schema
201 Successfully created audio collection CollectionCreateResponse
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List audio collections

curl -X GET "https://api.shutterstock.com/v2/audio/collections" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "page=1" \
  --data-urlencode "per_page=100" \
  --data-urlencode "embed=share_code"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const queryParams = {
  "page": "1",
  "per_page": "100",
  "embed": "share_code",
};

audioApi.getTrackCollectionList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "page" => "1",
  "per_page" => "100",
  "embed" => "share_code"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/collections" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio get-track-collection-list \
  --page 1 \
  --per_page 100 \
  --embed share_code

GET /v2/audio/collections Try it out

This endpoint lists your collections of audio tracks and their basic attributes.

Parameters

Parameter Type Description
embed [string]

Which sharing information to include in the response, such as a URL to the collection

Valid values: share_code, share_url

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 150

Default: 100

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "293542904",
      "name": "My collection",
      "total_item_count": 85,
      "items_updated_time": "2021-05-20T16:15:22-04:00",
      "cover_item": {
        "id": "297886754"
      }
    }
  ],
  "page": 1,
  "per_page": 100,
  "total_count": 1
}

Responses

Status Description Schema
200 OK CollectionDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get the details of audio collections

curl -X GET "https://api.shutterstock.com/v2/audio/collections/48433107" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

audioApi.getTrackCollection("48433107")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/collections/48433107",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio get-track-collection 48433107

GET /v2/audio/collections/{id} Try it out

This endpoint gets more detailed information about a collection, including the number of items in it and when it was last updated. To get the tracks in collections, use GET /v2/audio/collections/{id}/items.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

embed [string]

Which sharing information to include in the response, such as a URL to the collection

Valid values: share_code, share_url

share_code string

Code to retrieve a shared collection

Accepted authentication

Example responses

OK

{
  "id": "293542904",
  "name": "My collection",
  "total_item_count": 85,
  "items_updated_time": "2021-05-20T16:15:22-04:00",
  "cover_item": {
    "id": "297886754"
  }
}

Responses

Status Description Schema
200 OK Collection
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Rename audio collections

DATA='{
  "name": "Best rock music"
}'

curl -X POST "https://api.shutterstock.com/v2/audio/collections/48433107" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const collectionId = "48433107";

const body = {
  "name": "Best rock music"
};

audioApi.renameTrackCollection(collectionId, body)
  .catch((error) => {
    console.error(error);
  });
$body = [
  "name" => "Best rock music"
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/collections/48433107",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "name": "Best rock music"
}' > data.json

shutterstock audio rename-collection 48433107 data.json

POST /v2/audio/collections/{id} Try it out

This endpoint sets a new name for a collection.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

Body

Schema: CollectionUpdateRequest

Collection changes

Field Type Description
name
(Required)
string

The new name of the collection

Accepted authentication

Responses

Status Description Schema
204 Successfully updated collection None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Delete audio collections

curl -X DELETE "https://api.shutterstock.com/v2/audio/collections/48433111" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const collectionId = "48433107";

audioApi.deleteTrackCollection(collectionId)
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/collections/48433111",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_CUSTOMREQUEST => "DELETE",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio delete-track-collection 48433111

DELETE /v2/audio/collections/{id} Try it out

This endpoint deletes a collection.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

Accepted authentication

Responses

Status Description Schema
204 Successfully deleted collection None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Add audio tracks to collections

DATA='{
  "items": [
    {
      "id": "442583"
    },
    {
      "id": "7491192"
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/audio/collections/48433115/items" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const collectionId = "48433115";

const body = {
  "items": [
    {
      "id": "442583"
    },
    {
      "id": "7491192"
    }
  ]
};

audioApi.addTrackCollectionItems(collectionId, body)
  .catch((error) => {
    console.error(error);
  });
$body = [
  "items" => [
    [
      "id" => "442583"
    ],
    [
      "id" => "7491192"
    ]
  ]
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/collections/48433115/items",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "items": [
    {
      "id": "442583"
    },
    {
      "id": "7491192"
    }
  ]
}' > data.json

shutterstock audio add-collection-items 48433115 data.json

POST /v2/audio/collections/{id}/items Try it out

This endpoint adds one or more tracks to a collection by track IDs.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

Body

Schema: CollectionItemRequest

List of items to add to collection

Field Type Description
items
(Required)
[CollectionItem]

List of items

id
(Required)
string

ID of the item

added_time string

The date the item was added to the collection
Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

media_type string

The media type of the item, such as image, video, or audio

Accepted authentication

Responses

Status Description Schema
204 Successfully added collection items None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Get the contents of audio collections

curl -X GET "https://api.shutterstock.com/v2/audio/collections/126351027/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

audioApi.getTrackCollectionItems("126351027")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/collections/126351027/items",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio get-track-collection-items 126351027

GET /v2/audio/collections/{id}/items Try it out

This endpoint lists the IDs of tracks in a collection and the date that each was added.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 150

Default: 100

share_code string

Code to retrieve the contents of a shared collection

sort string

Sort order

Default: oldest

Valid values: newest, oldest

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "76688182",
      "media_type": "audio",
      "added_time": "2016-08-18T18:52:59-04:00"
    },
    {
      "id": "40005859",
      "media_type": "audio",
      "added_time": "2016-08-18T18:52:59-04:00"
    }
  ],
  "page": 1,
  "per_page": 2
}

Responses

Status Description Schema
200 OK CollectionItemDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Remove audio tracks from collections

curl -X DELETE "https://api.shutterstock.com/v2/audio/collections/48433119/items?item_id=36345523" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const audioApi = new sstk.AudioApi();

const collectionId = "48433119";

// Array of tracks to remove
const tracksToRemove = {
  "item_id": [
    "76688182",
    "40005859"
  ]
};

audioApi.deleteTrackCollectionItems(collectionId, tracksToRemove)
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/audio/collections/48433119/items?item_id=495863218",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_CUSTOMREQUEST => "DELETE",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock audio delete-track-collection-items 48433119 \
  --item-id 36345523

DELETE /v2/audio/collections/{id}/items Try it out

This endpoint removes one or more tracks from a collection.

Parameters

Parameter Type Description
id
(Required)
string

Collection ID

item_id [string]

One or more item IDs to remove from the collection

Accepted authentication

Responses

Status Description Schema
204 Successfully removed collection items None
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Collection not found None

Sound Effects

Search for sound effects

curl -X GET "https://api.shutterstock.com/v2/sfx/search" \
  --header "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "query=air" \
  --data-urlencode "duration_from=60"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const sfxApi = new sstk.SFXApi();

const queryParams = {
  "query": "air",
  "duration_from": 60
};

sfxApi.searchTracks(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "query" => "air",
  "duration_from" => 60
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/sfx/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock sfx search-tracks \
  --query air \
  --duration-from 60

GET /v2/sfx/search Try it out

This endpoint searches for sound effects. If you specify more than one search parameter, the API uses an AND condition.

Parameters

Parameter Type Description
added_date string

Show sound effects added on the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
added_date_end string

Show sound effects added before the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
added_date_start string

Show sound effects added on or after the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
duration integer

Show sound effects with the specified duration in seconds

duration_from integer

Show sound effects with the specified duration or longer in seconds

duration_to integer

Show sound effects with the specified duration or shorter in seconds

language Language

Set query and result language (uses Accept-Language header if not set)

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 500

Default: 20

query string

One or more search terms separated by spaces

safe boolean

Enable or disable safe search

Default: true

sort string

Sort by

Default: popular

Valid values: popular, newest, relevance, random, oldest

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "123",
      "description": "User interface calculations, scanning, thinking, text displayed on screen. Screen gak or garble.",
      "assets": {
        "preview_mp3": {
          "url": "https://cdn.shutterstock.com/shutterstock/sfx/21230/preview_ecom_ster/heavy-duty-interface-feedback.mp3"
        },
        "waveform": {
          "url": "https://cdn.shutterstock.com/shutterstock/sfx/21230/wvfm_img/heavy-duty-interface-feedback.png"
        }
      },
      "contributor": {
        "id": "321402911"
      },
      "title": "Heavy Duty Interface Feedback",
      "media_type": "sfx",
      "updated_time": "2022-08-04T15:11:15.711Z",
      "added_date": "2022-07-29"
    }
  ],
  "total_count": 14881,
  "search_id": "e6f84c4c-ffdd-499b-ad89-72c65a896ead"
}

Responses

Status Description Schema
200 OK SFXSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None
503 Service Unavailable None

Details

Get details about sound effects

curl -X GET "https://api.shutterstock.com/v2/sfx/442583" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "view=full" \
  --data-urlencode "library=shutterstock" \
  --data-urlencode "search_id=00000000-0000-0000-0000-000000000000"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const soundEffectsApi = new sstk.SoundEffectsApi();

const queryParams = {
  "view": "full",
  "library": "shutterstock",
  "search_id": "00000000-0000-0000-0000-000000000000",
};

soundEffectsApi.getSfxDetails("442583", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "view" => "full",
  "library" => "shutterstock",
  "search_id" => "00000000-0000-0000-0000-000000000000"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/sfx/442583" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock sfx get-sfx-details 442583 \
  --view full \
  --library shutterstock \
  --search_id 00000000-0000-0000-0000-000000000000

GET /v2/sfx/{id} Try it out

This endpoint shows information about a sound effect.

Parameters

Parameter Type Description
id
(Required)
integer

Audio track ID

language Language

Language for the keywords and categories in the response

library string

Which library to fetch from

Valid values: shutterstock, premier, premiumbeat

search_id string

The ID of the search that is related to this request

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "id": "123",
  "media_type": "sfx",
  "contributor": {
    "id": "1234"
  }
}

Responses

Status Description Schema
200 OK SFX
400 Bad Request None
401 Unauthorized None
403 Forbidden None
503 Service Unavailable None

List details about sound effects

curl -X GET "https://api.shutterstock.com/v2/sfx" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "id=1110335168" \
  --data-urlencode "id=465011609" \
  --data-urlencode "view=minimal" \
  --data-urlencode "library=shutterstock" \
  --data-urlencode "search_id=00000000-0000-0000-0000-000000000000"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const soundEffectsApi = new sstk.SoundEffectsApi();

const queryParams = {
  "id": [
    "1110335168",
    "465011609",
  ],
  "view": "minimal",
  "library": "shutterstock",
  "search_id": "00000000-0000-0000-0000-000000000000",
};

soundEffectsApi.getSfxListDetails(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$query = "id=1110335168&id=465011609&view=minimal&library=shutterstock&search_id=00000000-0000-0000-0000-000000000000";

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/sfx?$query",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock sfx get-sfx-list-details \
  --id 1110335168 \
  --id 465011609 \
  --view minimal \
  --library shutterstock \
  --search_id 00000000-0000-0000-0000-000000000000

GET /v2/sfx Try it out

This endpoint shows information about sound effects.

Parameters

Parameter Type Description
id
(Required)
[string]

One or more sound effect IDs

Format: A Shutterstock asset ID that starts with a nonzero digit and has any number of other digits
Example: 18765466

Maximum length: 500

language Language

Language for the keywords and categories in the response

library string

Which library to fetch from

Valid values: shutterstock, premier, premiumbeat

search_id string

The ID of the search that is related to this request

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "123",
      "media_type": "sfx",
      "contributor": {
        "id": "1234"
      }
    }
  ]
}

Responses

Status Description Schema
200 OK SFXDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Licenses And Downloads

List sound effects licenses

curl -X GET "https://api.shutterstock.com/v2/sfx/licenses" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "sfx_id=12345678" \
  --data-urlencode "license=standard" \
  --data-urlencode "username=aUniqueUsername" \
  --data-urlencode "start_date=2021-03-29T13:25:13.521Z" \
  --data-urlencode "end_date=2021-03-29T13:25:13.521Z"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const soundEffectsApi = new sstk.SoundEffectsApi();

const queryParams = {
  "sfx_id": "12345678",
  "license": "standard",
  "username": "aUniqueUsername",
  "start_date": "2021-03-29T13:25:13.521Z",
  "end_date": "2021-03-29T13:25:13.521Z",
};

soundEffectsApi.getSfxLicenseList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "sfx_id" => "12345678",
  "license" => "standard",
  "username" => "aUniqueUsername",
  "start_date" => "2021-03-29T13:25:13.521Z",
  "end_date" => "2021-03-29T13:25:13.521Z"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/sfx/licenses" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock sfx get-sfx-license-list \
  --sfx_id 12345678 \
  --license standard \
  --username aUniqueUsername \
  --start_date 2021-03-29T13:25:13.521Z \
  --end_date 2021-03-29T13:25:13.521Z

GET /v2/sfx/licenses Try it out

This endpoint lists existing licenses.

Parameters

Parameter Type Description
download_availability string

Filter licenses by download availability

Default: all

Valid values: all, downloadable, non_downloadable

end_date string

Show licenses created before the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

Must be > than start_date

license string

Show sound effects that are available with the specified license, such as standard or enhanced

Format: /^.+$/ (Minimum 1 character)

license_id string

Filter by the license ID

Format: /^.+$/ (Minimum 1 character)

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 200

Default: 20

sfx_id string

Show licenses for the specified sound effects ID

Format: /^[1-9]\d*$/ (A number that does not start with 0)

sort string

Sort order

Default: newest

Valid values: newest, oldest

start_date string

Show licenses created on or after the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

Must be <= than end_date

team_history boolean

Set to true to see license history for all members of your team.

username string

Filter licenses by username of licensee

Format: /^.+$/ (Minimum 1 character)

Accepted authentication

Example responses

OK

{
  "total_count": 2890,
  "page": 1,
  "per_page": 1,
  "data": [
    {
      "id": "e1eba3833793e77188d22caae8bac9f2cd",
      "user": {
        "username": "editorial_test_account_002"
      },
      "license": "premier_editorial_all_digital",
      "download_time": "2021-07-15T15:46:34.000Z",
      "is_downloadable": false,
      "image": {
        "id": "9763363ao",
        "format": {
          "size": "original"
        }
      },
      "subscription_id": "s12345678",
      "metadata": {
        "purchase_order": "123456",
        "client": "Company A",
        "job": "Important project",
        "other": "Important media"
      }
    }
  ]
}

Responses

Status Description Schema
200 OK DownloadHistoryDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

License sound effects

DATA='{
  "sound_effects": [
    {
      "format": "wav",
      "sfx_id": "123456789",
      "metadata": {
        "customer_id": "12345",
        "geo_location": "US",
        "number_viewed": "15",
        "search_term": "dog"
      },
      "show_modal": true,
      "size": "ambisonic",
      "subscription_id": "s12345678"
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/sfx/licenses" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$DATA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const soundEffectsApi = new sstk.SoundEffectsApi();

const body = {
  "sound_effects": [
    {
      "format": "wav",
      "sfx_id": "123456789",
      "metadata": {
        "customer_id": "12345",
        "geo_location": "US",
        "number_viewed": "15",
        "search_term": "dog"
      },
      "show_modal": true,
      "size": "ambisonic",
      "subscription_id": "s12345678"
    }
  ]
};

soundEffectsApi.licensesSFX(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "sound_effects": [
    [
      "format" => "wav",
      "sfx_id" => "123456789",
      "metadata": [
        "customer_id" => "12345",
        "geo_location" => "US",
        "number_viewed" => "15",
        "search_term" => "dog"
      ],
      "show_modal": true,
      "size" => "ambisonic",
      "subscription_id" => "s12345678"
    ]
  ]
]
encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/sfx/licenses",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
echo '{
  "sound_effects": [
    {
      "format": "wav",
      "sfx_id": "123456789",
      "metadata": {
        "customer_id": "12345",
        "geo_location": "US",
        "number_viewed": "15",
        "search_term": "dog"
      },
      "show_modal": true,
      "size": "ambisonic",
      "subscription_id": "s12345678"
    }
  ]
}' > data.json

export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock sfx licenses-sfx \
  data.json

POST /v2/sfx/licenses Try it out

This endpoint licenses sounds effect assets.

Parameters

Parameter Type Description

Body

Schema: LicenseSFXRequest

Field Type Description
sound_effects
(Required)
[LicenseSFX]

Sound effects to license for

sfx_id
(Required)
string

ID of the sounds effect being licensed

subscription_id
(Required)
string

ID of the subscription to use for the download.

audio_layout string


Valid values: ambisonic, 5.1, stereo

format string


Valid values: wav, mp3

search_id string

ID of the search that led to this licensing event

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "allotment_charge": 1,
      "download": {
        "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.mp3"
      },
      "sfx_id": "123456789"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

Responses

Status Description Schema
200 OK LicenseSFXResultDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Download sound effects

curl -X POST "https://api.shutterstock.com/v2/sfx/licenses/123/downloads" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const soundEffectsApi = new sstk.SoundEffectsApi();

soundEffectsApi.downloadSfx("123")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/sfx/licenses/123/downloads",
  CURLOPT_CUSTOMREQUEST => "POST",
  
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock sfx download-sfx 123

POST /v2/sfx/licenses/{id}/downloads Try it out

This endpoint redownloads sound effects that you have already received a license for. The download links in the response are valid for 8 hours.

Parameters

Parameter Type Description
id
(Required)
string

License ID

Accepted authentication

Example responses

OK

{
  "url": "http://download.dev.shutterstock.com/gatekeeper/abc/shutterstock_id.wav"
}

Responses

Status Description Schema
200 OK SfxUrl
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Editorial Images

Search editorial images

curl -X GET "https://api.shutterstock.com/v2/editorial/images/search" \
  -H "Accept: application/json" \
  -G \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  --data-urlencode "query=musician" \
  --data-urlencode "country=USA" \
  --data-urlencode "category=Alone,Performing" \
  --data-urlencode "sort=newest" \
  --data-urlencode "date_start=2018-10-23"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialApi = new sstk.EditorialApi();

const queryParams = {
  "query": "musician",
  "country": "USA",
  "category": "Alone,Performing",
  "sort": "newest",
  "date_start": "2018-10-23"
};

const country = "USA";

editorialApi.editorialImagesSearch(country, queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "query" => "musician",
  "country" => "USA",
  "category" => "Alone,Performing",
  "date_start" => "2018-10-23",
  "sort" => "newest"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/images/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial search-editorial-images \
  --country USA \
  --category Alone,Performing \
  --sort newest \
  --query musician \
  --date-start 2018-10-23

GET /v2/editorial/images/search Try it out

This endpoint searches for editorial images. If you specify more than one search parameter, the API uses an AND condition. For example, if you set the category parameter to "Alone,Performing" and also specify a query parameter, the results include only images that match the query and are in both the Alone and Performing categories. You can also filter search terms out in the query parameter by prefixing the term with NOT.

Parameters

Parameter Type Description
country
(Required)
string

Show only editorial content that is available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
category string

Show editorial content with each of the specified editorial categories; specify category names in a comma-separated list

cursor string

The cursor of the page with which to start fetching results; this cursor is returned from previous requests

date_end string

Show only editorial content generated on or before a specific date

Format: YYYY-MM-DD
Example: 2020-05-29
date_start string

Show only editorial content generated on or after a specific date

Format: YYYY-MM-DD
Example: 2020-05-29
per_page integer

Number of results per page

Minimum: 1

Maximum: 50

Default: 20

query string

One or more search terms separated by spaces

sort string

Sort by

Default: relevant

Valid values: relevant, newest, oldest

supplier_code [string]

Show only editorial content from certain suppliers

Accepted authentication

Example responses

OK

{
  "per_page": 1,
  "total_count": 46845,
  "search_id": "BaMzOAkpHIvfnuWVRFs1ag",
  "next": "eyJ2IjoyLCJzIjoxLCJwIjpbMF19",
  "prev": "",
  "data": [
    {
      "id": "10687730b",
      "title": "Soccer Premier League, Manchester, United Kingdom - 11 May 2021",
      "caption": "",
      "description": "Security and stewards stand outside the Old Trafford stadium in Manchester, England, ahead of the English Premier League soccer match between Manchester United and Leicester City. This is the first Manchester United home match since fans protested against American owner Joel Glazer, forcing the postponement of the team's Premier League game against Liverpool. The protests prompted Glazer to publish a letter in which he pledged to accelerate discussions with fans about supporters being able to have a greater say at the club",
      "byline": "Jon Super/AP/Shutterstock",
      "keywords": [
        "england",
        "europe",
        "leicester city fc",
        "manchester",
        "manchester united fc",
        "men's soccer",
        "men's sports",
        "premier league",
        "professional soccer",
        "soccer",
        "sports",
        "united kingdom",
        "western europe",
        "wsoc"
      ],
      "date_taken": "2021-05-11",
      "categories": [
        {
          "name": "Sport"
        }
      ],
      "aspect": 1.621,
      "assets": {
        "thumb_170": {
          "height": 105,
          "width": 170,
          "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
        },
        "thumb_220": {
          "height": 136,
          "width": 220,
          "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
        },
        "watermark_450": {
          "height": 278,
          "width": 450,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
        },
        "watermark_1500": {
          "height": 926,
          "width": 1500,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
        },
        "small_jpg": {
          "display_name": "Small",
          "width": 500,
          "height": 309,
          "is_licensable": true
        },
        "medium_jpg": {
          "display_name": "Med",
          "width": 1000,
          "height": 617,
          "is_licensable": true
        },
        "original": {
          "display_name": "Original",
          "height": 3693,
          "width": 5985,
          "is_licensable": true
        }
      }
    }
  ]
}

Responses

Status Description Schema
200 OK EditorialSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

List updated content

curl -X GET "https://api.shutterstock.com/v2/editorial/images/updated" \
  -H "Accept: application/json" \
  -G \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  --data-urlencode "type=edit" \
  --data-urlencode "country=USA" \
  --data-urlencode "date_updated_start=2020-02-02T13:00:00Z" \
  --data-urlencode "date_updated_end=2020-02-02T15:00:00Z"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialApi = new sstk.EditorialApi();

const type = "edit";
const dateUpdatedStart = "2020-02-02T13:00:00Z";
const dateUpdatedEnd = "2020-02-02T15:00:00Z";
const country = "USA";

editorialApi.getUpdatedImages(type, dateUpdatedStart, dateUpdatedEnd, country)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "type" => "edit",
  "country" => "USA",
  "date_updated_start" => "2020-02-02T13:00:00Z",
  "date_updated_end" => "2020-02-02T15:00:00Z",
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/images/updated?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-updated-editorial-images \
  --type edit \
  --country USA \
  --date-updated-start "2020-02-02T13:00:00Z" \
  --date-updated-end "2020-02-02T15:00:00Z"

GET /v2/editorial/images/updated Try it out

This endpoint lists editorial images that have been updated in the specified time period to update content management systems (CMS) or digital asset management (DAM) systems. In most cases, use the date_updated_start and date_updated_end parameters to specify a range updates based on when the updates happened. You can also use the date_taken_start and date_taken_end parameters to specify a range of updates based on when the image was taken.

Parameters

Parameter Type Description
country
(Required)
string

Show only editorial content that is available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
date_updated_end
(Required)
string

Show images images added, edited, or deleted before the specified date. Acceptable range is 1970-01-01T00:00:01 to 2038-01-19T00:00:00.

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z
date_updated_start
(Required)
string

Show images images added, edited, or deleted after the specified date. Acceptable range is 1970-01-01T00:00:01 to 2038-01-19T00:00:00.

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z
type
(Required)
string

Specify addition to return only images that were added or edit to return only images that were edited or deleted

Valid values: edit, addition

cursor string

The cursor of the page with which to start fetching results; this cursor is returned from previous requests

date_taken_end string

Show images that were taken before the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
date_taken_start string

Show images that were taken on or after the specified date; use this parameter if you want recently created images from the collection instead of updated older assets

Format: YYYY-MM-DD
Example: 2020-05-29
per_page integer

Number of results per page

Minimum: 100

Maximum: 500

Default: 500

sort string

Sort by

Default: newest

Valid values: newest, oldest

supplier_code [string]

Show only editorial content from certain suppliers

Accepted authentication

Example responses

OK

{
  "per_page": 1,
  "next": "eyJ2IjoxLCJzIjoxfQ==",
  "prev": "",
  "data": [
    {
      "id": "9804979n",
      "title": "Hong Kong kicks off international e-Sports competition, China - 24 Aug 2018",
      "caption": "",
      "description": "Members of the TyLoo e-Sports team from China prepare to face off against the Kinguin e-Sports team from Poland at the ICBC (Asia) e-Sports and Music Festival Hong Kong 2018, Hong Kong, China, 24 August 2018. The festival runs from 24 to 26 August with professional gamers from around the world competing in international e-sports tournaments.",
      "byline": "ALEX HOFFORD/EPA-EFE/Shutterstock",
      "supplier_code": "EPA",
      "keywords": [],
      "date_taken": "2018-08-24",
      "categories": [],
      "aspect": 1.481,
      "assets": {
        "thumb_170": {
          "height": 115,
          "width": 170,
          "url": "https://editorial01.shutterstock.com/thumb/9804979n/c4377a53/Shutterstock_9804979n.jpg"
        },
        "thumb_220": {
          "height": 149,
          "width": 220,
          "url": "https://editorial01.shutterstock.com/thumb-220/9804979n/c57a68c7/Shutterstock_9804979n.jpg"
        },
        "watermark_450": {
          "height": 304,
          "width": 450,
          "url": "https://editorial01.shutterstock.com/wm-preview-450/9804979n/37d19dce/Shutterstock_9804979n.jpg"
        },
        "watermark_1500": {
          "height": 1500,
          "width": 1040,
          "url": "https://editorial01.shutterstock.com/wm-preview-1500/9933285a/ab82fea4/Shutterstock_9933285a.jpg"
        },
        "original": {
          "display_name": "Original",
          "height": 3263,
          "width": 4831,
          "is_licensable": true
        },
        "small_jpg": {
          "display_name": "Small",
          "height": 337,
          "width": 500,
          "is_licensable": true
        },
        "medium_jpg": {
          "display_name": "Med",
          "height": 675,
          "width": 1000,
          "is_licensable": true
        }
      },
      "updated_time": "2019-07-15T20:04:44-04:00",
      "updates": [
        "addition"
      ],
      "commercial_status": {
        "status": "available"
      },
      "rights": {
        "countries": "CAN,+DEU,+GBR,+USA,-*"
      }
    }
  ]
}

Responses

Status Description Schema
200 OK EditorialUpdatedResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

Categories

List editorial categories

curl -X GET "https://api.shutterstock.com/v2/editorial/images/categories" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

editorialImagesApi.listEditorialImageCategories()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/images/categories",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial list-editorial-image-categories

GET /v2/editorial/images/categories Try it out

This endpoint lists the categories that editorial images can belong to, which are separate from the categories that other types of assets can belong to.

Parameters

None.

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "name": "Animal"
    },
    {
      "name": "Awards"
    },
    {
      "name": "Art"
    },
    {
      "name": "Film Stills"
    }
  ]
}

Responses

Status Description Schema
200 OK EditorialImageCategoryResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Details

Get editorial content details

curl -X GET "https://api.shutterstock.com/v2/editorial/images/9926131a" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "country=USA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

const queryParams = {
  "country": "USA",
};

editorialImagesApi.getEditorialImage("9926131a", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "country" => "USA"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/images/9926131a" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-image 9926131a \
  --country USA

GET /v2/editorial/images/{id} Try it out

This endpoint shows information about an editorial image, including a URL to a preview image and the sizes that it is available in.

Parameters

Parameter Type Description
country
(Required)
string

Returns only if the content is available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
id
(Required)
string

Editorial ID

Accepted authentication

Example responses

OK

{
  "id": "10687730b",
  "title": "Soccer Premier League, Manchester, United Kingdom - 11 May 2021",
  "caption": "",
  "description": "Security and stewards stand outside the Old Trafford stadium in Manchester, England, ahead of the English Premier League soccer match between Manchester United and Leicester City. This is the first Manchester United home match since fans protested against American owner Joel Glazer, forcing the postponement of the team's Premier League game against Liverpool. The protests prompted Glazer to publish a letter in which he pledged to accelerate discussions with fans about supporters being able to have a greater say at the club",
  "byline": "Jon Super/AP/Shutterstock",
  "keywords": [
    "england",
    "europe",
    "leicester city fc",
    "manchester",
    "manchester united fc",
    "men's soccer",
    "men's sports",
    "premier league",
    "professional soccer",
    "soccer",
    "sports",
    "united kingdom",
    "western europe",
    "wsoc"
  ],
  "date_taken": "2021-05-11",
  "categories": [
    {
      "name": "Sport"
    }
  ],
  "aspect": 1.621,
  "assets": {
    "thumb_170": {
      "height": 105,
      "width": 170,
      "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
    },
    "thumb_220": {
      "height": 136,
      "width": 220,
      "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
    },
    "watermark_450": {
      "height": 278,
      "width": 450,
      "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
    },
    "watermark_1500": {
      "height": 926,
      "width": 1500,
      "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
    },
    "small_jpg": {
      "display_name": "Small",
      "width": 500,
      "height": 309,
      "is_licensable": true
    },
    "medium_jpg": {
      "display_name": "Med",
      "width": 1000,
      "height": 617,
      "is_licensable": true
    },
    "original": {
      "display_name": "Original",
      "height": 3693,
      "width": 5985,
      "is_licensable": true
    }
  }
}

Responses

Status Description Schema
200 OK EditorialContent
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Not Found None

Licenses And Downloads

List editorial image licenses

curl -X GET "https://api.shutterstock.com/v2/editorial/images/licenses" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "image_id=12345678" \
  --data-urlencode "license=premier_editorial_all_digital" \
  --data-urlencode "username=aUniqueUsername" \
  --data-urlencode "start_date=2021-03-29T13:25:13.521Z" \
  --data-urlencode "end_date=2021-03-29T13:25:13.521Z"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

const queryParams = {
  "image_id": "12345678",
  "license": "premier_editorial_all_digital",
  "username": "aUniqueUsername",
  "start_date": "2021-03-29T13:25:13.521Z",
  "end_date": "2021-03-29T13:25:13.521Z",
};

editorialImagesApi.getEditorialImageLicenseList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "image_id" => "12345678",
  "license" => "premier_editorial_all_digital",
  "username" => "aUniqueUsername",
  "start_date" => "2021-03-29T13:25:13.521Z",
  "end_date" => "2021-03-29T13:25:13.521Z"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/images/licenses" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-image-license-list \
  --image_id 12345678 \
  --license premier_editorial_all_digital \
  --username aUniqueUsername \
  --start_date 2021-03-29T13:25:13.521Z \
  --end_date 2021-03-29T13:25:13.521Z

GET /v2/editorial/images/licenses Try it out

This endpoint lists existing editorial image licenses.

Parameters

Parameter Type Description
download_availability string

Filter licenses by download availability

Default: all

Valid values: all, downloadable, non_downloadable

end_date string

Show licenses created before the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z
image_id string

Show licenses for the specified editorial image ID

license string

Show editorial images that are available with the specified license name

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Maximum: 200

Default: 20

sort string

Sort order

Default: newest

Valid values: newest, oldest

start_date string

Show licenses created on or after the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z
team_history boolean

Set to true to see license history for all members of your team.

username string

Filter licenses by username of licensee

Accepted authentication

Example responses

OK

{
  "total_count": 2890,
  "page": 1,
  "per_page": 1,
  "data": [
    {
      "id": "e1eba3833793e77188d22caae8bac9f2cd",
      "user": {
        "username": "editorial_test_account_002"
      },
      "license": "premier_editorial_all_digital",
      "download_time": "2021-07-15T15:46:34.000Z",
      "is_downloadable": false,
      "image": {
        "id": "9763363ao",
        "format": {
          "size": "original"
        }
      },
      "subscription_id": "s12345678",
      "metadata": {
        "purchase_order": "123456",
        "client": "Company A",
        "job": "Important project",
        "other": "Important media"
      }
    }
  ]
}

Responses

Status Description Schema
200 OK DownloadHistoryDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

License editorial content

DATA='{
  "editorial": [
    {
      "editorial_id": "8594090h",
      "license": "premier_editorial_comp"
    }
  ],
  "country": "USA"
}'

curl -X POST "https://api.shutterstock.com/v2/editorial/images/licenses" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialApi = new sstk.EditorialApi();

const body = {
  "editorial": [
    {
      "editorial_id": "8594090h",
      "license": "premier_editorial_comp"
    }
  ],
  "country": "USA"
};

editorialApi.licenseEditorialImage(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "editorial" => [
    [
      "editorial_id" => "8594090h",
      "license" => "premier_editorial_comp"
    ]
  ],
  "country" => "USA"
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/images/licenses",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "editorial": [
    {
      "editorial_id": "8594090h",
      "license": "premier_editorial_comp"
    }
  ],
  "country": "USA"
}' > data.json

shutterstock editorial license-editorial-images data.json

POST /v2/editorial/images/licenses Try it out

This endpoint gets licenses for one or more editorial images. You must specify the country and one or more editorial images to license. The download links in the response are valid for 8 hours.

Parameters

None.

Body

Schema: LicenseEditorialContentRequest

License editorial content

Field Type Description
country
(Required)
ISOCountryCode

Mandatory country code for where the editorial content will be distributed; this value is used for rights checks

editorial
(Required)
[LicenseEditorialContent]

Editorial content to license

editorial_id
(Required)
string

Editorial ID

license
(Required)
string

License agreement to use for licensing

metadata LicenseRequestMetadata

Additional information for license requests for enterprise accounts and API subscriptions, 4 fields maximum; which fields are required is set by the account holder

size string

Asset size to download

Default: original

Valid values: small, medium, original

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "allotment_charge": 1,
      "editorial_id": "69656358",
      "download": {
        "url": "https://s3-eu-west-1.amazonaws.com/api-downloads.rexfeatures.com/[random-characters].jpg?Expires=1524717323"
      }
    }
  ],
  "page": 1,
  "per_page": 1,
  "total_count": 12
}

Responses

Status Description Schema
200 OK LicenseEditorialContentResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

Livefeeds

Get editorial livefeed list

curl -X GET "https://api.shutterstock.com/v2/editorial/images/livefeeds" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "country=USA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

const queryParams = {
  "country": "USA",
};

editorialImagesApi.getEditorialImageLivefeedList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "country" => "USA"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/images/livefeeds" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-image-livefeed-list \
  --country USA

GET /v2/editorial/images/livefeeds Try it out

Parameters

Parameter Type Description
country
(Required)
string

Returns only livefeeds that are available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 50

Default: 20

Accepted authentication

Example responses

OK

{
  "page": 1,
  "per_page": 1,
  "total_count": 5300,
  "data": [
    {
      "id": "2018%2F07%2F17%2FPrince%20Charles%20and%20Camilla%20Duchess%20of%20Cornwall%20visit%20to%20Cornwall%2C%20Day%202",
      "name": "Prince Charles and Camilla Duchess of Cornwall visit to Cornwall, Day 2",
      "total_item_count": 38,
      "created_time": "2018-07-17T12:42:03+00:00",
      "cover_item": {
        "height": 117,
        "width": 170,
        "url": "https://editorial01.qa.shuttercorp.net/thumb/9763363q/51e28f39/Shutterstock_9763363q.jpg",
        "id": "9763363q"
      }
    }
  ]
}

Responses

Status Description Schema
200 OK EditorialImageLivefeedList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Not Found None

Get editorial livefeed

curl -X GET "https://api.shutterstock.com/v2/editorial/images/livefeeds/2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "country=USA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

const queryParams = {
  "country": "USA",
};

editorialImagesApi.getEditorialImageLivefeed("2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "country" => "USA"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/images/livefeeds/2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-image-livefeed 2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London \
  --country USA

GET /v2/editorial/images/livefeeds/{id} Try it out

Parameters

Parameter Type Description
country
(Required)
string

Returns only if the livefeed is available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
id
(Required)
string

Editorial livefeed ID; must be an URI encoded string

Accepted authentication

Example responses

OK

{
  "id": "2018%2F07%2F17%2FPrince%20Charles%20and%20Camilla%20Duchess%20of%20Cornwall%20visit%20to%20Cornwall%2C%20Day%202",
  "name": "Prince Charles and Camilla Duchess of Cornwall visit to Cornwall, Day 2",
  "total_item_count": 38,
  "created_time": "2018-07-17T12:42:03+00:00",
  "cover_item": {
    "height": 117,
    "width": 170,
    "url": "https://editorial01.qa.shuttercorp.net/thumb/9763363q/51e28f39/Shutterstock_9763363q.jpg",
    "id": "9763363q"
  }
}

Responses

Status Description Schema
200 OK EditorialImageLivefeed
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Not Found None

Get editorial livefeed items

curl -X GET "https://api.shutterstock.com/v2/editorial/images/livefeeds/2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "country=USA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

const queryParams = {
  "country": "USA",
};

editorialImagesApi.getEditorialImageLivefeedItems("2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "country" => "USA"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/images/livefeeds/2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London/items" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-image-livefeed-items 2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London \
  --country USA

GET /v2/editorial/images/livefeeds/{id}/items Try it out

Parameters

Parameter Type Description
country
(Required)
string

Returns only if the livefeed items are available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
id
(Required)
string

Editorial livefeed ID; must be an URI encoded string

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "10687730b",
      "title": "Soccer Premier League, Manchester, United Kingdom - 11 May 2021",
      "caption": "",
      "description": "Security and stewards stand outside the Old Trafford stadium in Manchester, England, ahead of the English Premier League soccer match between Manchester United and Leicester City. This is the first Manchester United home match since fans protested against American owner Joel Glazer, forcing the postponement of the team's Premier League game against Liverpool. The protests prompted Glazer to publish a letter in which he pledged to accelerate discussions with fans about supporters being able to have a greater say at the club",
      "byline": "Jon Super/AP/Shutterstock",
      "keywords": [
        "england",
        "europe",
        "leicester city fc",
        "manchester",
        "manchester united fc",
        "men's soccer",
        "men's sports",
        "premier league",
        "professional soccer",
        "soccer",
        "sports",
        "united kingdom",
        "western europe",
        "wsoc"
      ],
      "date_taken": "2021-05-11",
      "categories": [
        {
          "name": "Sport"
        }
      ],
      "aspect": 1.621,
      "assets": {
        "thumb_170": {
          "height": 105,
          "width": 170,
          "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
        },
        "thumb_220": {
          "height": 136,
          "width": 220,
          "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
        },
        "watermark_450": {
          "height": 278,
          "width": 450,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
        },
        "watermark_1500": {
          "height": 926,
          "width": 1500,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
        },
        "small_jpg": {
          "display_name": "Small",
          "width": 500,
          "height": 309,
          "is_licensable": true
        },
        "medium_jpg": {
          "display_name": "Med",
          "width": 1000,
          "height": 617,
          "is_licensable": true
        },
        "original": {
          "display_name": "Original",
          "height": 3693,
          "width": 5985,
          "is_licensable": true
        }
      }
    }
  ],
  "page": 1,
  "per_page": 1,
  "total_count": 23
}

Responses

Status Description Schema
200 OK EditorialImageContentDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Not Found None

Legacy

(Deprecated) Get editorial content details

curl -X GET "https://api.shutterstock.com/v2/editorial/9926131a" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "country=USA" \
  --data-urlencode "search_id=00000000-0000-0000-0000-000000000000"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

const queryParams = {
  "country": "USA",
  "search_id": "00000000-0000-0000-0000-000000000000",
};

editorialImagesApi.getEditorialImage("9926131a", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "country" => "USA",
  "search_id" => "00000000-0000-0000-0000-000000000000"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/9926131a" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-image 9926131a \
  --country USA \
  --search_id 00000000-0000-0000-0000-000000000000

GET /v2/editorial/{id} Try it out

Deprecated; use GET /v2/editorial/images/{id} instead to show information about an editorial image, including a URL to a preview image and the sizes that it is available in.

Parameters

Parameter Type Description
country
(Required)
string

Returns only if the content is available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
id
(Required)
string

Editorial ID

search_id string

The ID of the search that is related to this request

Accepted authentication

Example responses

OK

{
  "id": "10687730b",
  "title": "Soccer Premier League, Manchester, United Kingdom - 11 May 2021",
  "caption": "",
  "description": "Security and stewards stand outside the Old Trafford stadium in Manchester, England, ahead of the English Premier League soccer match between Manchester United and Leicester City. This is the first Manchester United home match since fans protested against American owner Joel Glazer, forcing the postponement of the team's Premier League game against Liverpool. The protests prompted Glazer to publish a letter in which he pledged to accelerate discussions with fans about supporters being able to have a greater say at the club",
  "byline": "Jon Super/AP/Shutterstock",
  "keywords": [
    "england",
    "europe",
    "leicester city fc",
    "manchester",
    "manchester united fc",
    "men's soccer",
    "men's sports",
    "premier league",
    "professional soccer",
    "soccer",
    "sports",
    "united kingdom",
    "western europe",
    "wsoc"
  ],
  "date_taken": "2021-05-11",
  "categories": [
    {
      "name": "Sport"
    }
  ],
  "aspect": 1.621,
  "assets": {
    "thumb_170": {
      "height": 105,
      "width": 170,
      "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
    },
    "thumb_220": {
      "height": 136,
      "width": 220,
      "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
    },
    "watermark_450": {
      "height": 278,
      "width": 450,
      "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
    },
    "watermark_1500": {
      "height": 926,
      "width": 1500,
      "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
    },
    "small_jpg": {
      "display_name": "Small",
      "width": 500,
      "height": 309,
      "is_licensable": true
    },
    "medium_jpg": {
      "display_name": "Med",
      "width": 1000,
      "height": 617,
      "is_licensable": true
    },
    "original": {
      "display_name": "Original",
      "height": 3693,
      "width": 5985,
      "is_licensable": true
    }
  }
}

Responses

Status Description Schema
200 OK EditorialContent
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Not Found None

(Deprecated) License editorial content

DATA='{
  "editorial": [
    {
      "editorial_id": "8594090h",
      "license": "premier_editorial_comp"
    }
  ],
  "country": "USA"
}'

curl -X POST "https://api.shutterstock.com/v2/editorial/licenses" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialApi = new sstk.EditorialApi();

const body = {
  "editorial": [
    {
      "editorial_id": "8594090h",
      "license": "premier_editorial_comp"
    }
  ],
  "country": "USA"
};

editorialApi.licenseEditorialImage(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "editorial" => [
    [
      "editorial_id" => "8594090h",
      "license" => "premier_editorial_comp"
    ]
  ],
  "country" => "USA"
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/licenses",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "editorial": [
    {
      "editorial_id": "8594090h",
      "license": "premier_editorial_comp"
    }
  ],
  "country": "USA"
}' > data.json

shutterstock editorial license-editorial-image data.json

POST /v2/editorial/licenses Try it out

Deprecated; use POST /v2/editorial/images/licenses instead to get licenses for one or more editorial images. You must specify the country and one or more editorial images to license. The download links in the response are valid for 8 hours.

Parameters

None.

Body

Schema: LicenseEditorialContentRequest

License editorial content

Field Type Description
country
(Required)
ISOCountryCode

Mandatory country code for where the editorial content will be distributed; this value is used for rights checks

editorial
(Required)
[LicenseEditorialContent]

Editorial content to license

editorial_id
(Required)
string

Editorial ID

license
(Required)
string

License agreement to use for licensing

metadata LicenseRequestMetadata

Additional information for license requests for enterprise accounts and API subscriptions, 4 fields maximum; which fields are required is set by the account holder

size string

Asset size to download

Default: original

Valid values: small, medium, original

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "editorial_id": "69656358",
      "download": {
        "url": "https://s3-eu-west-1.amazonaws.com/api-downloads.rexfeatures.com/[random-characters].jpg?Expires=1524717323"
      }
    }
  ]
}

Responses

Status Description Schema
200 OK LicenseEditorialContentResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

(Deprecated) Get editorial livefeed list

curl -X GET "https://api.shutterstock.com/v2/editorial/livefeeds" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "country=USA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

const queryParams = {
  "country": "USA",
};

editorialImagesApi.getEditorialLivefeedList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "country" => "USA"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/livefeeds" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-livefeed-list \
  --country USA

GET /v2/editorial/livefeeds Try it out

Deprecated; use GET /v2/editorial/images/livefeeds instead to get a list of editorial livefeeds.

Parameters

Parameter Type Description
country
(Required)
string

Returns only livefeeds that are available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 50

Default: 20

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "2018%2F07%2F17%2FPrince%20Charles%20and%20Camilla%20Duchess%20of%20Cornwall%20visit%20to%20Cornwall%2C%20Day%202",
      "name": "Prince Charles and Camilla Duchess of Cornwall visit to Cornwall, Day 2",
      "total_item_count": 38,
      "created_time": "2018-07-17T12:42:03+00:00",
      "cover_item": {
        "height": 117,
        "width": 170,
        "url": "https://editorial01.qa.shuttercorp.net/thumb/9763363q/51e28f39/Shutterstock_9763363q.jpg",
        "id": "9763363q"
      }
    }
  ],
  "page": 1,
  "per_page": 1,
  "total_count": 56
}

Responses

Status Description Schema
200 OK EditorialLivefeedList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

(Deprecated) Get editorial livefeed

curl -X GET "https://api.shutterstock.com/v2/editorial/livefeeds/2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "country=USA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

const queryParams = {
  "country": "USA",
};

editorialImagesApi.getEditorialLivefeed("2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "country" => "USA"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/livefeeds/2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-livefeed 2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London \
  --country USA

GET /v2/editorial/livefeeds/{id} Try it out

Deprecated: use GET /v2/editorial/images/livefeeds/{id} instead to get an editorial livefeed.

Parameters

Parameter Type Description
country
(Required)
string

Returns only if the livefeed is available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
id
(Required)
string

Editorial livefeed ID; must be an URI encoded string

Accepted authentication

Example responses

OK

{
  "id": "2018%2F07%2F17%2FPrince%20Charles%20and%20Camilla%20Duchess%20of%20Cornwall%20visit%20to%20Cornwall%2C%20Day%202",
  "name": "Prince Charles and Camilla Duchess of Cornwall visit to Cornwall, Day 2",
  "total_item_count": 38,
  "created_time": "2018-07-17T12:42:03+00:00",
  "cover_item": {
    "height": 117,
    "width": 170,
    "url": "https://editorial01.qa.shuttercorp.net/thumb/9763363q/51e28f39/Shutterstock_9763363q.jpg",
    "id": "9763363q"
  }
}

Responses

Status Description Schema
200 OK EditorialLivefeed
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

(Deprecated) Get editorial livefeed items

curl -X GET "https://api.shutterstock.com/v2/editorial/livefeeds/2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "country=USA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

const queryParams = {
  "country": "USA",
};

editorialImagesApi.getEditorialLivefeedItems("2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "country" => "USA"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/livefeeds/2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London/items" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-livefeed-items 2018%2F10%2F15%2FWomen%20of%20the%20Year%20Lunch%20%26%20Awards%2C%20London \
  --country USA

GET /v2/editorial/livefeeds/{id}/items Try it out

Deprecated; use GET /v2/editorial/images/livefeeds/{id}/items instead to get editorial livefeed items.

Parameters

Parameter Type Description
country
(Required)
string

Returns only if the livefeed items are available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
id
(Required)
string

Editorial livefeed ID; must be an URI encoded string

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "10687730b",
      "title": "Soccer Premier League, Manchester, United Kingdom - 11 May 2021",
      "caption": "",
      "description": "Security and stewards stand outside the Old Trafford stadium in Manchester, England, ahead of the English Premier League soccer match between Manchester United and Leicester City. This is the first Manchester United home match since fans protested against American owner Joel Glazer, forcing the postponement of the team's Premier League game against Liverpool. The protests prompted Glazer to publish a letter in which he pledged to accelerate discussions with fans about supporters being able to have a greater say at the club",
      "byline": "Jon Super/AP/Shutterstock",
      "keywords": [
        "england",
        "europe",
        "leicester city fc",
        "manchester",
        "manchester united fc",
        "men's soccer",
        "men's sports",
        "premier league",
        "professional soccer",
        "soccer",
        "sports",
        "united kingdom",
        "western europe",
        "wsoc"
      ],
      "date_taken": "2021-05-11",
      "categories": [
        {
          "name": "Sport"
        }
      ],
      "aspect": 1.621,
      "assets": {
        "thumb_170": {
          "height": 105,
          "width": 170,
          "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
        },
        "thumb_220": {
          "height": 136,
          "width": 220,
          "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
        },
        "watermark_450": {
          "height": 278,
          "width": 450,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
        },
        "watermark_1500": {
          "height": 926,
          "width": 1500,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
        },
        "small_jpg": {
          "display_name": "Small",
          "width": 500,
          "height": 309,
          "is_licensable": true
        },
        "medium_jpg": {
          "display_name": "Med",
          "width": 1000,
          "height": 617,
          "is_licensable": true
        },
        "original": {
          "display_name": "Original",
          "height": 3693,
          "width": 5985,
          "is_licensable": true
        }
      }
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 16
}

Responses

Status Description Schema
200 OK EditorialContentDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

(Deprecated) Search editorial content

curl -X GET "https://api.shutterstock.com/v2/editorial/search" \
  -H "Accept: application/json" \
  -G \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  --data-urlencode "query=football" \
  --data-urlencode "country=USA" \
  --data-urlencode "sort=newest" \
  --data-urlencode "date_start=2018-10-23"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialApi = new sstk.EditorialApi();

const queryParams = {
  "query": "football",
  "country": "USA",
  "sort": "newest",
  "date_start": "2018-10-23"
};

const country = "USA";

editorialApi.searchEditorial(country, queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "query" => "football",
  "country" => "USA",
  "date_start" => "2018-10-23",
  "sort" => "newest"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial search-editorial \
  --country USA \
  --sort newest \
  --query football \
  --date-start 2018-10-23

GET /v2/editorial/search Try it out

Deprecated; use GET /v2/editorial/images/search instead to search for editorial images.

Parameters

Parameter Type Description
country
(Required)
string

Show only editorial content that is available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
category string

Show editorial content within a certain editorial category; specify by category name

cursor string

The cursor of the page with which to start fetching results; this cursor is returned from previous requests

date_end string

Show only editorial content generated on or before a specific date

Format: YYYY-MM-DD
Example: 2020-05-29
date_start string

Show only editorial content generated on or after a specific date

Format: YYYY-MM-DD
Example: 2020-05-29
per_page integer

Number of results per page

Minimum: 1

Maximum: 50

Default: 20

query string

One or more search terms separated by spaces

sort string

Sort by

Default: relevant

Valid values: relevant, newest, oldest

supplier_code [string]

Show only editorial content from certain suppliers

Accepted authentication

Example responses

OK

{
  "per_page": 1,
  "total_count": 46845,
  "search_id": "BaMzOAkpHIvfnuWVRFs1ag",
  "next": "eyJ2IjoyLCJzIjoxLCJwIjpbMF19",
  "prev": "",
  "data": [
    {
      "id": "10687730b",
      "title": "Soccer Premier League, Manchester, United Kingdom - 11 May 2021",
      "caption": "",
      "description": "Security and stewards stand outside the Old Trafford stadium in Manchester, England, ahead of the English Premier League soccer match between Manchester United and Leicester City. This is the first Manchester United home match since fans protested against American owner Joel Glazer, forcing the postponement of the team's Premier League game against Liverpool. The protests prompted Glazer to publish a letter in which he pledged to accelerate discussions with fans about supporters being able to have a greater say at the club",
      "byline": "Jon Super/AP/Shutterstock",
      "keywords": [
        "england",
        "europe",
        "leicester city fc",
        "manchester",
        "manchester united fc",
        "men's soccer",
        "men's sports",
        "premier league",
        "professional soccer",
        "soccer",
        "sports",
        "united kingdom",
        "western europe",
        "wsoc"
      ],
      "date_taken": "2021-05-11",
      "categories": [
        {
          "name": "Sport"
        }
      ],
      "aspect": 1.621,
      "assets": {
        "thumb_170": {
          "height": 105,
          "width": 170,
          "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
        },
        "thumb_220": {
          "height": 136,
          "width": 220,
          "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
        },
        "watermark_450": {
          "height": 278,
          "width": 450,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
        },
        "watermark_1500": {
          "height": 926,
          "width": 1500,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
        },
        "small_jpg": {
          "display_name": "Small",
          "width": 500,
          "height": 309,
          "is_licensable": true
        },
        "medium_jpg": {
          "display_name": "Med",
          "width": 1000,
          "height": 617,
          "is_licensable": true
        },
        "original": {
          "display_name": "Original",
          "height": 3693,
          "width": 5985,
          "is_licensable": true
        }
      }
    }
  ]
}

Responses

Status Description Schema
200 OK EditorialSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

(Deprecated) List editorial categories

curl -X GET "https://api.shutterstock.com/v2/editorial/categories" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialImagesApi = new sstk.EditorialImagesApi();

editorialImagesApi.getEditorialCategories()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/categories",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-categories

GET /v2/editorial/categories Try it out

Deprecated; use GET /v2/editorial/images/categories instead. This endpoint lists the categories that editorial images can belong to, which are separate from the categories that other types of assets can belong to.

Parameters

None.

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "name": "Animal"
    },
    {
      "name": "Awards"
    },
    {
      "name": "Art"
    }
  ]
}

Responses

Status Description Schema
200 OK EditorialCategoryResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None

(Deprecated) List updated content

curl -X GET "https://api.shutterstock.com/v2/editorial/updated" \
  -H "Accept: application/json" \
  -G \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  --data-urlencode "type=edit" \
  --data-urlencode "country=USA" \
  --data-urlencode "date_updated_start=2020-02-02T13:00:00Z" \
  --data-urlencode "date_updated_end=2020-02-02T15:00:00Z"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialApi = new sstk.EditorialApi();

const type = "edit";
const dateUpdatedStart = "2020-02-02T13:00:00Z";
const dateUpdatedEnd = "2020-02-02T15:00:00Z";
const country = "USA";

editorialApi.getUpdatedImages(type, dateUpdatedStart, dateUpdatedEnd, country)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "type" => "edit",
  "country" => "USA",
  "date_updated_start" => "2020-02-02T13:00:00Z",
  "date_updated_end" => "2020-02-02T15:00:00Z",
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/updated?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-updated-images \
  --type edit \
  --country USA \
  --date-updated-start "2020-02-02T13:00:00Z" \
  --date-updated-end "2020-02-02T15:00:00Z"

GET /v2/editorial/updated Try it out

Deprecated; use GET /v2/editorial/images/updated instead to get recently updated items.

Parameters

Parameter Type Description
country
(Required)
string

Show only editorial content that is available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
date_updated_end
(Required)
string

Show images images added, edited, or deleted before the specified date. Acceptable range is 1970-01-01T00:00:01 to 2038-01-19T00:00:00.

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z
date_updated_start
(Required)
string

Show images images added, edited, or deleted after the specified date. Acceptable range is 1970-01-01T00:00:01 to 2038-01-19T00:00:00.

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z
type
(Required)
string

Specify addition to return only images that were added or edit to return only images that were edited or deleted

Valid values: edit, addition

cursor string

The cursor of the page with which to start fetching results; this cursor is returned from previous requests

date_taken_end string

Show images that were taken before the specified date

Format: YYYY-MM-DD
Example: 2020-05-29
date_taken_start string

Show images that were taken on or after the specified date; use this parameter if you want recently created images from the collection instead of updated older assets

Format: YYYY-MM-DD
Example: 2020-05-29
per_page integer

Number of results per page

Minimum: 100

Maximum: 500

Default: 500

sort string

Sort by

Default: newest

Valid values: newest, oldest

supplier_code [string]

Show only editorial content from certain suppliers

Accepted authentication

Example responses

OK

{
  "per_page": 1,
  "next": "eyJ2IjoxLCJzIjoxfQ==",
  "prev": "",
  "data": [
    {
      "id": "9804979n",
      "title": "Hong Kong kicks off international e-Sports competition, China - 24 Aug 2018",
      "caption": "",
      "description": "Members of the TyLoo e-Sports team from China prepare to face off against the Kinguin e-Sports team from Poland at the ICBC (Asia) e-Sports and Music Festival Hong Kong 2018, Hong Kong, China, 24 August 2018. The festival runs from 24 to 26 August with professional gamers from around the world competing in international e-sports tournaments.",
      "byline": "ALEX HOFFORD/EPA-EFE/Shutterstock",
      "supplier_code": "EPA",
      "keywords": [],
      "date_taken": "2018-08-24",
      "categories": [],
      "aspect": 1.481,
      "assets": {
        "thumb_170": {
          "height": 115,
          "width": 170,
          "url": "https://editorial01.shutterstock.com/thumb/9804979n/c4377a53/Shutterstock_9804979n.jpg"
        },
        "thumb_220": {
          "height": 149,
          "width": 220,
          "url": "https://editorial01.shutterstock.com/thumb-220/9804979n/c57a68c7/Shutterstock_9804979n.jpg"
        },
        "watermark_450": {
          "height": 304,
          "width": 450,
          "url": "https://editorial01.shutterstock.com/wm-preview-450/9804979n/37d19dce/Shutterstock_9804979n.jpg"
        },
        "watermark_1500": {
          "height": 1500,
          "width": 1040,
          "url": "https://editorial01.shutterstock.com/wm-preview-1500/9933285a/ab82fea4/Shutterstock_9933285a.jpg"
        },
        "original": {
          "display_name": "Original",
          "height": 3263,
          "width": 4831,
          "is_licensable": true
        },
        "small_jpg": {
          "display_name": "Small",
          "height": 337,
          "width": 500,
          "is_licensable": true
        },
        "medium_jpg": {
          "display_name": "Med",
          "height": 675,
          "width": 1000,
          "is_licensable": true
        }
      },
      "updated_time": "2019-07-15T20:04:44-04:00",
      "updates": [
        "addition"
      ],
      "commercial_status": {
        "status": "available"
      },
      "rights": {
        "countries": "CAN,+DEU,+GBR,+USA,-*"
      }
    }
  ]
}

Responses

Status Description Schema
200 OK EditorialUpdatedResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

Editorial Video

Search editorial video content

curl -X GET "https://api.shutterstock.com/v2/editorial/videos/search" \
  -H "Accept: application/json" \
  -G \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  --data-urlencode "query=musician" \
  --data-urlencode "country=USA" \
  --data-urlencode "category=Alone,Performing" \
  --data-urlencode "sort=newest" \
  --data-urlencode "date_start=2018-10-23"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialApi = new sstk.EditorialVideoApi();

const queryParams = {
  "query": "musician",
  "country": "USA",
  "category": "Alone,Performing",
  "sort": "newest",
  "date_start": "2018-10-23"
};

const country = "USA";

editorialApi.searchEditorialVideos(country, queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "query" => "musician",
  "country" => "USA",
  "category" => "Alone,Performing",
  "date_start" => "2018-10-23",
  "sort" => "newest"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/videos/search?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial search-editorial-videos \
  --country USA \
  --sort newest \
  --query musician \
  --category Alone,Performing \
  --date-start 2018-10-23

GET /v2/editorial/videos/search Try it out

This endpoint searches for editorial videos. If you specify more than one search parameter, the API uses an AND condition. For example, if you set the category parameter to "Alone,Performing" and also specify a query parameter, the results include only videos that match the query and are in both the Alone and Performing categories. You can also filter search terms out in the query parameter by prefixing the term with NOT.

Parameters

Parameter Type Description
country
(Required)
string

Show only editorial video content that is available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
category string

Show editorial content with each of the specified editorial categories; specify category names in a comma-separated list

cursor string

The cursor of the page with which to start fetching results; this cursor is returned from previous requests

date_end string

Show only editorial video content generated on or before a specific date

Format: YYYY-MM-DD
Example: 2020-05-29
date_start string

Show only editorial video content generated on or after a specific date

Format: YYYY-MM-DD
Example: 2020-05-29
fps number

Show only editorial video content generated with specific frames per second

per_page integer

Number of results per page

Minimum: 1

Maximum: 50

Default: 20

query string

One or more search terms separated by spaces

resolution string

Show only editorial video content with specific resolution

Valid values: 4k, high_definition, standard_definition

sort string

Sort by

Default: relevant

Valid values: relevant, newest, oldest

supplier_code [string]

Show only editorial video content from certain suppliers

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "10679854a",
      "title": "Peeps the Goose Has a Blast on a Jet Ski, Prior Lake, Minnesota, USA - 13 Nov 2020",
      "caption": "",
      "description": "Info from Licensor: \"Peeps the Canadian Goose has been raised with our family since a gosling. Peeps has made appearances on our local news channels, TV shows, and local newspapers. He has been trained to fly next to four wheelers, jet ski's, and boats. He has brought joy to many people during the pandemic including those with cancer.\"",
      "byline": "ViralHog/Shutterstock",
      "keywords": [
        "2020",
        "adorable",
        "birds",
        "bizarre",
        "canadian goose",
        "cute",
        "domesticated animals",
        "entertainment",
        "feel good",
        "flew",
        "flies",
        "fly",
        "flying",
        "fun",
        "goose",
        "jet skis",
        "nature",
        "odd",
        "pets",
        "played",
        "playing",
        "plays",
        "prior lake",
        "sports",
        "strange",
        "sweet",
        "usa",
        "viralhog",
        "virals",
        "water sports",
        "weird"
      ],
      "date_taken": "2020-11-13",
      "categories": [],
      "aspect": 1,
      "assets": {
        "preview_mp4": {
          "url": "https://qa.editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
        },
        "preview_webm": {
          "url": "https://qa.editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
        },
        "thumb_jpg": {
          "url": "https://qa.editorial-cdn.shuttercorp.net/thumb-1/10679854a/M5TcAf30Ncjcge2eMTI4NjY=/Shutterstock_10679854a.jpg"
        },
        "original": {
          "height": 1080,
          "width": 1080,
          "fps": 30,
          "format": "avc1",
          "file_size": 82233387,
          "display_name": "HD",
          "is_licensable": true
        }
      }
    }
  ],
  "per_page": 1,
  "total_count": 331,
  "search_id": "zhmz9zLmpQehdTPvg8cacQ",
  "next": "eyJ2IjoyLCJzIjoyMCwicCI6WzBdfQ==",
  "prev": ""
}

Responses

Status Description Schema
200 OK EditorialVideoSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

Categories

List editorial video categories

curl -X GET "https://api.shutterstock.com/v2/editorial/videos/categories" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialVideoApi = new sstk.EditorialVideoApi();

editorialVideoApi.listEditorialVideoCategories()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/videos/categories",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial list-editorial-video-categories

GET /v2/editorial/videos/categories Try it out

This endpoint lists the categories that editorial videos can belong to, which are separate from the categories that other types of assets can belong to.

Parameters

None.

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "name": "Animal"
    },
    {
      "name": "Awards"
    },
    {
      "name": "Art"
    },
    {
      "name": "Film Stills"
    }
  ]
}

Responses

Status Description Schema
200 OK EditorialVideoCategoryResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Details

Get editorial video content details

curl -X GET "https://api.shutterstock.com/v2/editorial/videos/9926131a" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "country=USA" \
  --data-urlencode "search_id=00000000-0000-0000-0000-000000000000"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialVideoApi = new sstk.EditorialVideoApi();

const queryParams = {
  "country": "USA",
  "search_id": "00000000-0000-0000-0000-000000000000",
};

editorialVideoApi.getEditorialVideo("9926131a", queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "country" => "USA",
  "search_id" => "00000000-0000-0000-0000-000000000000"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/videos/9926131a" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-video 9926131a \
  --country USA \
  --search_id 00000000-0000-0000-0000-000000000000

GET /v2/editorial/videos/{id} Try it out

This endpoint shows information about an editorial image, including a URL to a preview image and the sizes that it is available in.

Parameters

Parameter Type Description
country
(Required)
string

Returns only if the content is available for distribution in a certain country

Format: A three-character (ISO 3166 Alpha-3) country code
Example: USA
id
(Required)
string

Editorial ID

search_id string

The ID of the search that is related to this request

Accepted authentication

Example responses

OK

{
  "id": "10679854a",
  "title": "Peeps the Goose Has a Blast on a Jet Ski, Prior Lake, Minnesota, USA - 13 Nov 2020",
  "caption": "",
  "description": "Info from Licensor: \"Peeps the Canadian Goose has been raised with our family since a gosling. Peeps has made appearances on our local news channels, TV shows, and local newspapers. He has been trained to fly next to four wheelers, jet ski's, and boats. He has brought joy to many people during the pandemic including those with cancer.\"",
  "byline": "ViralHog/Shutterstock",
  "keywords": [
    "2020",
    "adorable",
    "birds",
    "bizarre",
    "canadian goose",
    "cute",
    "domesticated animals",
    "entertainment",
    "feel good",
    "flew",
    "flies",
    "fly",
    "flying",
    "fun",
    "goose",
    "jet skis",
    "nature",
    "odd",
    "pets",
    "played",
    "playing",
    "plays",
    "prior lake",
    "sports",
    "strange",
    "sweet",
    "usa",
    "viralhog",
    "virals",
    "water sports",
    "weird"
  ],
  "date_taken": "2020-11-13",
  "categories": [],
  "aspect": 1,
  "assets": {
    "preview_mp4": {
      "url": "https://qa.editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
    },
    "preview_webm": {
      "url": "https://qa.editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
    },
    "thumb_jpg": {
      "url": "https://qa.editorial-cdn.shuttercorp.net/thumb-1/10679854a/M5TcAf30Ncjcge2eMTI4NjY=/Shutterstock_10679854a.jpg"
    },
    "original": {
      "height": 1080,
      "width": 1080,
      "fps": 30,
      "format": "avc1",
      "file_size": 82233387,
      "display_name": "HD",
      "is_licensable": true
    }
  }
}

Responses

Status Description Schema
200 OK EditorialVideoContent
400 Bad Request None
401 Unauthorized None
403 Forbidden None
406 Not Acceptable None

Licenses And Downloads

List editorial video licenses

curl -X GET "https://api.shutterstock.com/v2/editorial/videos/licenses" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "video_id=12345678" \
  --data-urlencode "license=premier_editorial_all_media" \
  --data-urlencode "username=aUniqueUsername" \
  --data-urlencode "start_date=2021-03-29T13:25:13.521Z" \
  --data-urlencode "end_date=2021-03-29T13:25:13.521Z"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialVideoApi = new sstk.EditorialVideoApi();

const queryParams = {
  "video_id": "12345678",
  "license": "premier_editorial_all_media",
  "username": "aUniqueUsername",
  "start_date": "2021-03-29T13:25:13.521Z",
  "end_date": "2021-03-29T13:25:13.521Z",
};

editorialVideoApi.getEditorialVideoLicenseList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "video_id" => "12345678",
  "license" => "premier_editorial_all_media",
  "username" => "aUniqueUsername",
  "start_date" => "2021-03-29T13:25:13.521Z",
  "end_date" => "2021-03-29T13:25:13.521Z"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/videos/licenses" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock editorial get-editorial-video-license-list \
  --video_id 12345678 \
  --license premier_editorial_all_media \
  --username aUniqueUsername \
  --start_date 2021-03-29T13:25:13.521Z \
  --end_date 2021-03-29T13:25:13.521Z

GET /v2/editorial/videos/licenses Try it out

This endpoint lists existing editorial video licenses.

Parameters

Parameter Type Description
download_availability string

Filter licenses by download availability

Default: all

Valid values: all, downloadable, non_downloadable

end_date string

Show licenses created before the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z
license string

Show editorial videos that are available with the specified license name

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Maximum: 200

Default: 20

sort string

Sort order

Default: newest

Valid values: newest, oldest

start_date string

Show licenses created on or after the specified date

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z
team_history boolean

Set to true to see license history for all members of your team.

username string

Filter licenses by username of licensee

video_id string

Show licenses for the specified editorial video ID

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "e1dbb15d5384725d292cf64f793ac45062",
      "user": {
        "username": "username1"
      },
      "license": "premier_editorial_all_digital",
      "download_time": "2020-12-18T02:22:56.000Z",
      "is_downloadable": false,
      "video": {
        "id": "11231389im",
        "format": {
          "size": "original"
        }
      },
      "subscription_id": "s12345678",
      "metadata": {
        "client": "Company A",
        "other": "Important media",
        "purchase_order": "457234",
        "job": "Important project"
      }
    },
    {
      "id": "e1dbb15d5384725d292cf64f793ac45114",
      "user": {
        "username": "username2"
      },
      "license": "premier_editorial_all_digital",
      "download_time": "2020-12-11T01:24:22.000Z",
      "is_downloadable": false,
      "video": {
        "id": "11231442aa",
        "format": {
          "size": "original"
        }
      },
      "subscription_id": "s12345678",
      "metadata": {
        "client": "Company B",
        "other": "Important image",
        "purchase_order": "5583831",
        "job": "Important project"
      }
    }
  ],
  "page": 1,
  "per_page": 2
}

Responses

Status Description Schema
200 OK DownloadHistoryDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

License editorial video content

DATA='{
  "editorial": [
    {
      "editorial_id": "8594090h",
      "license": "premier_editorial_video_comp"
    }
  ],
  "country": "USA"
}'

curl -X POST "https://api.shutterstock.com/v2/editorial/videos/licenses" \
  -d "$DATA" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const editorialApi = new sstk.EditorialApi();

const body = {
  "editorial": [
    {
      "editorial_id": "10687492a",
      "license": "premier_editorial_video_comp"
    }
  ],
  "country": "USA"
};

editorialApi.licenseEditorialVideo(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "editorial" => [
    [
      "editorial_id" => "10687492a",
      "license" => "premier_editorial_video_comp"
    ]
  ],
  "country" => "USA"
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/editorial/videos/licenses",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo '{
  "editorial": [
    {
      "editorial_id": "8594090h",
      "license": "premier_editorial_video_comp"
    }
  ],
  "country": "USA"
}' > data.json

shutterstock editorial license-editorial-video data.json

POST /v2/editorial/videos/licenses Try it out

This endpoint gets licenses for one or more editorial videos. You must specify the country and one or more editorial videos to license. The download links in the response are valid for 8 hours.

Parameters

None.

Body

Schema: LicenseEditorialVideoContentRequest

License editorial video content

Field Type Description
country
(Required)
ISOCountryCode

Mandatory country code for where the editorial content will be distributed; this value is used for rights checks

editorial
(Required)
[LicenseEditorialVideoContent]

Editorial content to license

editorial_id
(Required)
string

Editorial ID

license
(Required)
string

License agreement to use for licensing

Valid values: premier_editorial_video_digital_only, premier_editorial_video_all_media, premier_editorial_video_all_media_single_territory, premier_editorial_video_comp

metadata LicenseRequestMetadata

Additional information for license requests for enterprise accounts and API subscriptions, 4 fields maximum; which fields are required is set by the account holder

size string

Asset size to download

Default: original

Valid values: original

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "editorial_id": "69656358",
      "download": {
        "url": "https://s3-eu-west-1.amazonaws.com/api-downloads.rexfeatures.com/[random-characters].mov?Expires=1524717323"
      }
    }
  ]
}

Responses

Status Description Schema
200 OK LicenseEditorialContentResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Services API

The endpoints in the Services API provide access to Shutterstock's machine learning tools and other services.

Computer Vision

Legacy

Upload ephemeral images

curl -X POST "https://api.shutterstock.com/v2/images" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"base64_image\":\"`base64 myImage.jpg | tr -d '\n'`\"}"
const sstk = require("shutterstock-api");
const fs = require("fs");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const imagesApi = new sstk.ImagesApi();

const imageFile = fs.readFileSync("./myImage.jpg");
const base64File = Buffer.from(imageFile).toString("base64");

const body = new sstk.ImageCreateRequest(base64File);

const queryParams = {
  "page": 1,
  "per_page": 20,
  "view": "minimal"
};

imagesApi.uploadEphemeralImage(body)
  .then((data) => {
    console.log(data.id);
    return imagesApi.getSimilarImages(data.id, queryParams);
  })
  .then((similarImageData) => {
    console.log(similarImageData);
  })
  .catch((error) => {
    console.error(error);
  });
$imageData = file_get_contents("myImage.jpg");
$encodedImageData = base64_encode($imageData);

$body = [
  "base64_image" => $encodedImageData
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/images",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo "{\"base64_image\":\"`base64 myImage.jpg  | tr -d '\n'`\"}" > data.json

shutterstock images upload-ephemeral-image data.json

POST /v2/images Try it out

Deprecated; use POST /v2/cv/images instead. This endpoint uploads an image for reverse image search. The image must be in JPEG or PNG format. To get the search results, pass the ID that this endpoint returns to the GET /v2/images/{id}/similar endpoint.

Parameters

None.

Body

Schema: ImageCreateRequest

The image data in JPEG or PNG format

Field Type Description
base64_image
(Required)
string

A Base 64 encoded jpeg or png; images can be no larger than 10mb and can be no larger than 10,000 pixels in width or height

Accepted authentication

Example responses

Created

{
  "id": "Udb14e1c3540bdbf82b4b3fe12d3a44f2"
}

Responses

Status Description Schema
201 Created ImageCreateResponse
400 Bad Request None
401 Unauthorized None
403 Forbidden None
413 Payload Too Large None

Upload

Upload images

curl -X POST "https://api.shutterstock.com/v2/cv/images" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"base64_image\":\"`base64 myImage.jpg | tr -d '\n'`\"}"
const sstk = require("shutterstock-api");
const fs = require("fs");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const computerVisionApi = new sstk.ComputerVisionApi();

const imageFile = fs.readFileSync("./myImage.jpg");
const base64File = Buffer.from(imageFile).toString("base64");

const body = new sstk.ImageCreateRequest(base64File);

computerVisionApi.uploadImage(body)
  .then((data) => {
    console.log(data.upload_id);
  });
$imageData = file_get_contents("myImage.jpg");
$encodedImageData = base64_encode($imageData);

$uploadBody = [
  "base64_image" => $encodedImageData
];
$uploadEncodedBody = json_encode($uploadBody);

$uploadOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/images",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $uploadEncodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $uploadOptions);
$uploadResponse = curl_exec($handle);
curl_close($handle);

$uploadDecodedResponse = json_decode($uploadResponse);
print_r($uploadDecodedResponse->upload_id);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo "{\"base64_image\":\"`base64 myImage.jpg  | tr -d '\n'`\"}" > data.json

shutterstock cv upload-image data.json

POST /v2/cv/images Try it out

This endpoint uploads an image for reverse image or video search. Images must be in JPEG or PNG format. To get the search results, pass the upload ID that this endpoint returns to the GET /v2/cv/similar/images or GET /v2/cv/similar/videos endpoints. Contact us for access to this endpoint.

Parameters

None.

Body

Schema: ImageCreateRequest

A Base 64 encoded jpeg or png; images can be no larger than 10mb and can be no larger than 10,000 pixels in width or height

Field Type Description
base64_image
(Required)
string

A Base 64 encoded jpeg or png; images can be no larger than 10mb and can be no larger than 10,000 pixels in width or height

Accepted authentication

Example responses

Created

{
  "upload_id": "Udb14e1c3540bdbf82b4b3fe12d3a44f2"
}

Responses

Status Description Schema
201 Created ComputerVisionImageCreateResponse
400 Bad Request None
401 Unauthorized None
403 Forbidden None
413 Payload Too Large None
415 Unsupported Media Type None

Similar

List similar images

RESPONSE=$(curl -X POST "https://api.shutterstock.com/v2/cv/images" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"base64_image\":\"`base64 myImage.jpg | tr -d '\n'`\"}")

echo "The next step requires the jq program."

UPLOAD_ID=$(jq -r .upload_id <<< $RESPONSE)

curl -X GET "https://api.shutterstock.com/v2/cv/similar/images" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "asset_id=$UPLOAD_ID"
const sstk = require("shutterstock-api");
const fs = require("fs");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const computerVisionApi = new sstk.ComputerVisionApi();

const imageFile = fs.readFileSync("./myImage.jpg");
const base64File = Buffer.from(imageFile).toString("base64");

const body = new sstk.ImageCreateRequest(base64File);

computerVisionApi.uploadImage(body)
  .then((data) => {
    console.log(data.upload_id);
    return computerVisionApi.getSimilarImages(data.upload_id);
  })
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$imageData = file_get_contents("myImage.jpg");
$encodedImageData = base64_encode($imageData);

$uploadBody = [
  "base64_image" => $encodedImageData
];
$uploadEncodedBody = json_encode($uploadBody);

$uploadOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/images",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $uploadEncodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $uploadOptions);
$uploadResponse = curl_exec($handle);
curl_close($handle);

$uploadDecodedResponse = json_decode($uploadResponse);
print_r($uploadDecodedResponse->upload_id);

$similarQuery = [
  "asset_type" => "images",
  "asset_id" => $uploadDecodedResponse->upload_id,
];

$similarOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/similar/images?" . http_build_query($similarQuery),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $similarOptions);
$similarResponse = curl_exec($handle);
curl_close($handle);

print_r($similarResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo "{\"base64_image\":\"`base64 myImage.jpg  | tr -d '\n'`\"}" > data.json

shutterstock cv upload-image data.json > response.json

echo "The next step requires the jq program."

UPLOAD_ID=$(jq -r .upload_id response.json)

shutterstock cv get-similar-images \
  --asset-id $UPLOAD_ID

GET /v2/cv/similar/images Try it out

This endpoint returns images that are visually similar to an image that you specify or upload.

Parameters

Parameter Type Description
asset_id
(Required)
string

The asset ID or upload ID to find similar images for

language Language

Language for the keywords and categories in the response

license [string]

Show only images with the specified license

Default: commercial

Valid values: commercial, editorial

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 500

Default: 20

safe boolean

Enable or disable safe search

Default: true

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1572478477",
      "aspect": 1.5,
      "assets": {
        "preview": {
          "height": 300,
          "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 450
        },
        "small_thumb": {
          "height": 67,
          "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 100
        },
        "large_thumb": {
          "height": 100,
          "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 150
        },
        "mosaic": {
          "height": 167,
          "url": "https://image.shutterstock.com/image-photo/stock-photo-cropped-image-of-woman-gardening-250nw-1572478477.jpg",
          "width": 250
        },
        "huge_thumb": {
          "height": 260,
          "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
          "width": 390
        },
        "preview_1000": {
          "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
          "width": 1000,
          "height": 667
        },
        "preview_1500": {
          "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 1500,
          "height": 1000
        }
      },
      "contributor": {
        "id": "250738318"
      },
      "description": "cropped image of woman gardening",
      "image_type": "photo",
      "has_model_release": true,
      "media_type": "image"
    }
  ],
  "page": 1,
  "per_page": 5,
  "search_id": "749090bb-2967-4a20-b22e-c800dc845e10",
  "spellcheck_info": {},
  "total_count": 45
}

Responses

Status Description Schema
200 OK ImageSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List similar videos

RESPONSE=$(curl -X POST "https://api.shutterstock.com/v2/cv/images" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"base64_image\":\"`base64 myImage.jpg | tr -d '\n'`\"}")

echo "The next step requires the jq program."

UPLOAD_ID=$(jq -r .upload_id <<< $RESPONSE)

curl -X GET "https://api.shutterstock.com/v2/cv/similar/videos" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "asset_id=$UPLOAD_ID"
const sstk = require("shutterstock-api");
const fs = require("fs");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const computerVisionApi = new sstk.ComputerVisionApi();

const imageFile = fs.readFileSync("./myImage.jpg");
const base64File = Buffer.from(imageFile).toString("base64");

const body = new sstk.ImageCreateRequest(base64File);

computerVisionApi.uploadImage(body)
  .then((data) => {
    console.log(data.upload_id);
    return computerVisionApi.getSimilarVideos(data.upload_id);
  })
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$imageData = file_get_contents("myImage.jpg");
$encodedImageData = base64_encode($imageData);

$uploadBody = [
  "base64_image" => $encodedImageData
];
$uploadEncodedBody = json_encode($uploadBody);

$uploadOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/images",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $uploadEncodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $uploadOptions);
$uploadResponse = curl_exec($handle);
curl_close($handle);

$uploadDecodedResponse = json_decode($uploadResponse);
print_r($uploadDecodedResponse->upload_id);

$similarQuery = [
  "asset_type" => "images",
  "asset_id" => $uploadDecodedResponse->upload_id,
];

$similarOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/similar/videos?" . http_build_query($similarQuery),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $similarOptions);
$similarResponse = curl_exec($handle);
curl_close($handle);

print_r($similarResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo "{\"base64_image\":\"`base64 myImage.jpg  | tr -d '\n'`\"}" > data.json

shutterstock cv upload-image data.json > response.json

echo "The next step requires the jq program."

UPLOAD_ID=$(jq -r .upload_id response.json)

shutterstock cv get-similar-videos \
  --asset-id $UPLOAD_ID

GET /v2/cv/similar/videos Try it out

This endpoint returns videos that are visually similar to an image that you specify or upload.

Parameters

Parameter Type Description
asset_id
(Required)
string

The asset ID or upload ID to find similar videos for

language Language

Language for the keywords and categories in the response

license [string]

Show only videos with the specified license

Default: commercial

Valid values: commercial, editorial

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 200

Default: 20

safe boolean

Enable or disable safe search

Default: true

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "1033184651",
      "aspect": 1.778,
      "aspect_ratio": "16:9",
      "assets": {
        "thumb_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "thumb_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "preview_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "preview_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "thumb_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        },
        "preview_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        }
      },
      "contributor": {
        "id": "4411978"
      },
      "description": "Camera follows hipster millennial young woman in orange jacket running up on top of mountain summit at sunset, jumps on top of rocks, raises arms into air, happy and drunk on life, youth and happiness",
      "duration": 14.081,
      "has_model_release": true,
      "media_type": "video"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123,
  "search_id": "749090bb-2967-4a20-b22e-c800dc845e10"
}

Responses

Status Description Schema
200 OK VideoSearchResults
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Keywords

List suggested keywords

RESPONSE=$(curl -X POST "https://api.shutterstock.com/v2/cv/images" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"base64_image\":\"`base64 myImage.jpg | tr -d '\n'`\"}")

echo "The next step requires the jq program."

UPLOAD_ID=$(jq -r .upload_id <<< $RESPONSE)

curl -X GET "https://api.shutterstock.com/v2/cv/keywords" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "asset_id=$UPLOAD_ID"
const sstk = require("shutterstock-api");
const fs = require("fs");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const computerVisionApi = new sstk.ComputerVisionApi();

const imageFile = fs.readFileSync("./myImage.jpg");
const base64File = Buffer.from(imageFile).toString("base64");

const body = new sstk.ImageCreateRequest(base64File);

computerVisionApi.uploadImage(body)
  .then((data) => {
    console.log(data.upload_id);
    return computerVisionApi.getKeywords(data.upload_id);
  })
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$imageData = file_get_contents("myImage.jpg");
$encodedImageData = base64_encode($imageData);

$uploadBody = [
  "base64_image" => $encodedImageData
];
$uploadEncodedBody = json_encode($uploadBody);

$uploadOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/images",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $uploadEncodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $uploadOptions);
$uploadResponse = curl_exec($handle);
curl_close($handle);

$uploadDecodedResponse = json_decode($uploadResponse);
print_r($uploadDecodedResponse->upload_id);

$keywordsQuery = [
  "asset_id" => $uploadDecodedResponse->upload_id,
];

$keywordsOptions = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/cv/keywords?" . http_build_query($keywordsQuery),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $keywordsOptions);
$keywordsResponse = curl_exec($handle);
curl_close($handle);

print_r($keywordsResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

echo "{\"base64_image\":\"`base64 myImage.jpg  | tr -d '\n'`\"}" > data.json

shutterstock cv upload-image data.json > response.json

echo "The next step requires the jq program."

UPLOAD_ID=$(jq -r .upload_id response.json)

shutterstock cv get-keywords \
  --asset-id $UPLOAD_ID

GET /v2/cv/keywords Try it out

This endpoint returns a list of suggested keywords for a media item that you specify or upload.

Parameters

Parameter Type Description
asset_id
(Required)
string

The asset ID or upload ID to suggest keywords for

One of these formats:

  • Format: A Shutterstock upload ID consisting of the letter U followed by one or more other characters
    Example: U6ba16262e3bc2db470b8e3cfa8aaab25
  • Format: A Shutterstock asset ID that starts with a nonzero digit and has any number of other digits
    Example: 18765466

Accepted authentication

Example responses

OK

{
  "data": [
    "nature",
    "wildlife",
    "animal",
    "cute",
    "bamboo",
    "panda",
    "china",
    "wild",
    "endangered",
    "black",
    "bear"
  ]
}

Responses

Status Description Schema
200 OK KeywordDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
415 Unsupported Media Type None

Catalog

Search catalogs for assets

curl -X GET "https://api.shutterstock.com/v2/catalog/search" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "page=1" \
  --data-urlencode "per_page=50" \
  --data-urlencode "collection_id=126351028" \
  --data-urlencode "collection_id=126371055" \
  --data-urlencode "query=dogs on the beach"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const catalogApi = new sstk.CatalogApi();

const queryParams = {
  "page": 1,
  "per_page": 50,
  "collection_id": ["126351028", "126371055"],
  "query": "dogs on the beach",
};

catalogApi.searchCatalog(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "page" => 1,
  "per_page" => 50,
  "collection_id" => ["126351028", "126371055"],
  "query" => "dogs on the beach"
];

$encodedQueryFields = preg_replace(
  "/\%5B\d+\%5D/",
  "",
  http_build_query($queryFields),
);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/catalog/search?$encodedQueryFields",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock catalog search-catalog \
  --page 1 \
  --per_page 50 \
  --collection_id 126351028 \
  --collection_id 126371055 \
  --query "dogs on the beach"

GET /v2/catalog/search Try it out

This endpoint searches for assets in the account's catalog. If you specify more than one search parameter, the API uses an AND condition. Array parameters can be specified multiple times; in this case, the API uses an AND or an OR condition with those values, depending on the parameter. You can also filter search terms out in the query parameter by prefixing the term with NOT.

Parameters

Parameter Type Description
asset_type [string]

Filter by asset type

Valid values: image, video, audio, elements, editorial-image, editorial-video

collection_id [string]

Filter by collection id

Maximum length: 50

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Maximum: 500

Default: 20

query string

One or more search terms separated by spaces

sort string

Sort by

Default: newest

Valid values: newest, oldest

Accepted authentication

Example responses

OK

{
  "page": 1,
  "per_page": 1,
  "total_count": 82,
  "data": [
    {
      "id": "123",
      "asset": {
        "id": "1690105108",
        "type": "image",
        "name": "Young couple playing tennis at the court"
      },
      "created_time": "2021-06-10T13:26:09-04:00",
      "collection_ids": [
        "126351028"
      ]
    }
  ]
}

Responses

Status Description Schema
200 OK CatalogCollectionItemDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Collections

List catalog collections

curl -X GET "https://api.shutterstock.com/v2/catalog/collections" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "page=1" \
  --data-urlencode "per_page=20"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const catalogApi = new sstk.CatalogApi();

const queryParams = {
  "page": "1",
  "per_page": "20",
};

catalogApi.getCollections(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "page" => "1",
  "per_page" => "20"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/catalog/collections" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock catalog get-collections \
  --page 1 \
  --per_page 20

GET /v2/catalog/collections Try it out

This endpoint returns a list of catalog collections.

Parameters

Parameter Type Description
page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 2

Maximum: 50

Default: 20

shared boolean

Set to true to omit collections that you own and return only collections that are shared with you

sort string

Sort by

Default: newest

Valid values: newest, oldest

Accepted authentication

Example responses

OK

{
  "page": 1,
  "per_page": 20,
  "total_count": 1,
  "data": [
    {
      "id": "126351028",
      "name": "My collection",
      "cover_asset": {
        "id": "123",
        "asset": {
          "id": "1690105108",
          "type": "image",
          "name": "Young couple playing tennis at the court"
        },
        "created_time": "2021-06-10T13:26:09-04:00"
      },
      "total_item_count": 2,
      "created_time": "2021-05-20T16:15:22-04:00",
      "updated_time": "2021-06-10T13:26:09-04:00",
      "visibility": "public",
      "role_assignments": {
        "collection_id": "126351028",
        "roles": {
          "owners": [
            {
              "id": "321",
              "type": "USER",
              "email": "userOne@org.com"
            }
          ],
          "editors": [
            {
              "id": "987",
              "type": "USER",
              "email": "userTwo@org.com"
            }
          ],
          "viewers": []
        }
      }
    }
  ]
}

Responses

Status Description Schema
200 OK CatalogCollectionDataList
400 Invalid status value None

Create catalog collections

DATA='{
  "name": "New Collection",
  "visibility": "public",
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/catalog/collections" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$DATA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const catalogApi = new sstk.CatalogApi();

const body = {
  "name": "New Collection",
  "visibility": "public",
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
};

catalogApi.createCollection(body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "name" => "New Collection",
  "visibility" => "public",
  "items": [
    [
      "asset": [
        "id" => "1690105108",
        "type" => "image"
      ]
    ]
  ]
]
encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/catalog/collections",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
echo '{
  "name": "New Collection",
  "visibility": "public",
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
}' > data.json

export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock catalog create-collection \
  data.json

POST /v2/catalog/collections Try it out

This endpoint creates a catalog collection and optionally adds assets. To add assets to the collection later, use PATCH /v2/catalog/collections/{collection_id}/items.

Parameters

None.

Body

Schema: CreateCatalogCollection

Create a catalog collection and, optionally, add items.

Field Type Description
name
(Required)
string


Minimum length: 1

Maximum length: 100000

items [CreateCatalogCollectionItem]


Maximum length: 50

asset
(Required)
object


id string


type string


visibility string


Default: private

Valid values: private, public

Accepted authentication

Example responses

OK

{
  "id": "126351028",
  "name": "My collection",
  "cover_asset": {
    "id": "123",
    "asset": {
      "id": "1690105108",
      "type": "image",
      "name": "Young couple playing tennis at the court"
    },
    "created_time": "2021-06-10T13:26:09-04:00"
  },
  "total_item_count": 2,
  "created_time": "2021-05-20T16:15:22-04:00",
  "updated_time": "2021-06-10T13:26:09-04:00",
  "visibility": "public",
  "role_assignments": {
    "collection_id": "126351028",
    "roles": {
      "owners": [
        {
          "id": "321",
          "type": "USER",
          "email": "userOne@org.com"
        }
      ],
      "editors": [
        {
          "id": "987",
          "type": "USER",
          "email": "userTwo@org.com"
        }
      ],
      "viewers": []
    }
  }
}

Responses

Status Description Schema
201 OK CatalogCollection

Update collection metadata

DATA='{
  "name": "My Collection",
  "visibility": "public",
  "cover_asset": {
    "id": "123"
  }
}'

curl -X PATCH "https://api.shutterstock.com/v2/catalog/collections/126351028" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$DATA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const catalogApi = new sstk.CatalogApi();

const body = {
  "name": "My Collection",
  "visibility": "public",
  "cover_asset": {
    "id": "123"
  }
};

catalogApi.updateCollection("126351028", body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "name" => "My Collection",
  "visibility" => "public",
  "cover_asset": [
    "id" => "123"
  ]
]
encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/catalog/collections/126351028",
  CURLOPT_CUSTOMREQUEST => "PATCH",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
echo '{
  "name": "My Collection",
  "visibility": "public",
  "cover_asset": {
    "id": "123"
  }
}' > data.json

export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock catalog update-collection 126351028 \
  data.json

PATCH /v2/catalog/collections/{collection_id} Try it out

This endpoint updates the metadata of a catalog collection.

Parameters

Parameter Type Description
collection_id
(Required)
string

ID of collection that needs to be modified

Body

Schema: UpdateCatalogCollection

Collections Metadata to update

Field Type Description
cover_asset
(Required)
object


id string


name string


Minimum length: 1

Maximum length: 100000

visibility string


Valid values: private, public

Accepted authentication

Example responses

OK

{
  "id": "126351028",
  "name": "My collection",
  "cover_asset": {
    "id": "123",
    "asset": {
      "id": "1690105108",
      "type": "image",
      "name": "Young couple playing tennis at the court"
    },
    "created_time": "2021-06-10T13:26:09-04:00"
  },
  "total_item_count": 2,
  "created_time": "2021-05-20T16:15:22-04:00",
  "updated_time": "2021-06-10T13:26:09-04:00",
  "visibility": "public",
  "role_assignments": {
    "collection_id": "126351028",
    "roles": {
      "owners": [
        {
          "id": "321",
          "type": "USER",
          "email": "userOne@org.com"
        }
      ],
      "editors": [
        {
          "id": "987",
          "type": "USER",
          "email": "userTwo@org.com"
        }
      ],
      "viewers": []
    }
  }
}

Responses

Status Description Schema
200 OK CatalogCollection

Delete catalog collections

curl -X DELETE "https://api.shutterstock.com/v2/catalog/collections/126351028" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const catalogApi = new sstk.CatalogApi();

catalogApi.deleteCollection("126351028")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/catalog/collections/126351028",
  CURLOPT_CUSTOMREQUEST => "DELETE",
  
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock catalog delete-collection 126351028

DELETE /v2/catalog/collections/{collection_id} Try it out

This endpoint deletes a catalog collection. It does not remove the assets from the user's account's catalog.

Parameters

Parameter Type Description
collection_id
(Required)
string

The ID of the collection to delete

Accepted authentication

Responses

Status Description Schema
204 OK None
404 Collection not found None

Collection Items

Add items to catalog collections

DATA='{
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
}'

curl -X POST "https://api.shutterstock.com/v2/catalog/collections/126351028/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$DATA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const catalogApi = new sstk.CatalogApi();

const body = {
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
};

catalogApi.addToCollection("126351028", body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "items": [
    [
      "asset": [
        "id" => "1690105108",
        "type" => "image"
      ]
    ]
  ]
]
encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/catalog/collections/126351028/items",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
echo '{
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
}' > data.json

export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock catalog add-to-collection 126351028 \
  data.json

POST /v2/catalog/collections/{collection_id}/items Try it out

This endpoint adds assets to a catalog collection. It also automatically adds the assets to the user's account's catalog.

Parameters

Parameter Type Description
collection_id
(Required)
string

The ID of the collection to add assets to

Body

Schema: CreateCatalogCollectionItems

Collection item attributes to add to collection

Field Type Description
items
(Required)
[CreateCatalogCollectionItem]


Minimum length: 1

Maximum length: 50

asset
(Required)
object


id string


type string


Accepted authentication

Example responses

OK

{
  "id": "126351028",
  "name": "My collection",
  "cover_asset": {
    "id": "123",
    "asset": {
      "id": "1690105108",
      "type": "image",
      "name": "Young couple playing tennis at the court"
    },
    "created_time": "2021-06-10T13:26:09-04:00"
  },
  "total_item_count": 2,
  "created_time": "2021-05-20T16:15:22-04:00",
  "updated_time": "2021-06-10T13:26:09-04:00",
  "visibility": "public",
  "role_assignments": {
    "collection_id": "126351028",
    "roles": {
      "owners": [
        {
          "id": "321",
          "type": "USER",
          "email": "userOne@org.com"
        }
      ],
      "editors": [
        {
          "id": "987",
          "type": "USER",
          "email": "userTwo@org.com"
        }
      ],
      "viewers": []
    }
  }
}

Responses

Status Description Schema
200 OK CatalogCollection

Remove items from catalog collection

DATA='{
  "items": [
    {
      "id": "123"
    }
  ]
}'

curl -X DELETE "https://api.shutterstock.com/v2/catalog/collections/126351028/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$DATA"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const catalogApi = new sstk.CatalogApi();

const body = {
  "items": [
    {
      "id": "123"
    }
  ]
};

catalogApi.deleteFromCollection("126351028", body)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$body = [
  "items": [
    [
      "id" => "123"
    ]
  ]
]
encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/catalog/collections/126351028/items",
  CURLOPT_CUSTOMREQUEST => "DELETE",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN",
    "Content-Type: application/json"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
echo '{
  "items": [
    {
      "id": "123"
    }
  ]
}' > data.json

export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock catalog delete-from-collection 126351028 \
  data.json

DELETE /v2/catalog/collections/{collection_id}/items Try it out

This endpoint removes assets from a catalog collection. It does not remove the assets from the user's account's catalog.

Parameters

Parameter Type Description
collection_id
(Required)
string

The ID of the collection to remove assets from

Body

Schema: RemoveCatalogCollectionItems

Items to remove from the collection

Field Type Description
items
(Required)
[RemoveCatalogCollectionItem]


Minimum length: 1

Maximum length: 50

id
(Required)
string


Accepted authentication

Example responses

OK

{
  "id": "126351028",
  "name": "My collection",
  "cover_asset": {
    "id": "123",
    "asset": {
      "id": "1690105108",
      "type": "image",
      "name": "Young couple playing tennis at the court"
    },
    "created_time": "2021-06-10T13:26:09-04:00"
  },
  "total_item_count": 2,
  "created_time": "2021-05-20T16:15:22-04:00",
  "updated_time": "2021-06-10T13:26:09-04:00",
  "visibility": "public",
  "role_assignments": {
    "collection_id": "126351028",
    "roles": {
      "owners": [
        {
          "id": "321",
          "type": "USER",
          "email": "userOne@org.com"
        }
      ],
      "editors": [
        {
          "id": "987",
          "type": "USER",
          "email": "userTwo@org.com"
        }
      ],
      "viewers": []
    }
  }
}

Responses

Status Description Schema
200 OK CatalogCollection

Users API

The endpoints in the Users API provide access to information about user and contributor accounts.

Contributors

Contributors

Get details about multiple contributors

curl -X GET "https://api.shutterstock.com/v2/contributors" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "id=800506" \
  --data-urlencode "id=1653538"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const contributorsApi = new sstk.ContributorsApi();

const queryParams = {
  "id": [
    "800506",
    "1653538",
  ],
};

contributorsApi.getContributorList(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$query = "id=800506&id=1653538";

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/contributors?$query",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock contributors get-contributor-list \
  --id 800506 \
  --id 1653538

GET /v2/contributors Try it out

This endpoint lists information about one or more contributors, including contributor type, equipment they use and other attributes.

Parameters

Parameter Type Description
id
(Required)
[string]

One or more contributor IDs

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "about": "John Doe's photographs",
      "contributor_type": [
        "photographer"
      ],
      "display_name": "John Doe",
      "equipment": [
        "Nikon",
        "Fuji"
      ],
      "id": "12345678",
      "location": "US",
      "portfolio_url": "https://www.shutterstock.com/g/jdoe",
      "social_media": {
        "facebook": "http://example.com/jdoe",
        "google_plus": "http://example.com/jdoe",
        "linkedin": "http://example.com/jdoe",
        "pinterest": "http://example.com/jdoe",
        "tumblr": "http://example.com/jdoe",
        "twitter": "http://example.com/jdoe"
      },
      "styles": [
        "landscape",
        "nature",
        "footage_travel"
      ],
      "subjects": [
        "animals",
        "landmarks",
        "nature",
        "objects",
        "recreation"
      ],
      "website": "http://example.com/profiles/jdoe"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 15
}

Responses

Status Description Schema
200 OK ContributorProfileDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get details about a single contributor

curl -X GET "https://api.shutterstock.com/v2/contributors/1653538" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const contributorsApi = new sstk.ContributorsApi();

contributorsApi.getContributor("1653538")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/contributors/1653538",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock contributors get-contributor 1653538

GET /v2/contributors/{contributor_id} Try it out

This endpoint shows information about a single contributor, including contributor type, equipment they use, and other attributes.

Parameters

Parameter Type Description
contributor_id
(Required)
string

Contributor ID

Accepted authentication

Example responses

OK

{
  "about": "John Doe's photographs",
  "contributor_type": [
    "photographer"
  ],
  "display_name": "John Doe",
  "equipment": [
    "Nikon",
    "Fuji"
  ],
  "id": "12345678",
  "location": "US",
  "portfolio_url": "https://www.shutterstock.com/g/jdoe",
  "social_media": {
    "facebook": "http://example.com/jdoe",
    "google_plus": "http://example.com/jdoe",
    "linkedin": "http://example.com/jdoe",
    "pinterest": "http://example.com/jdoe",
    "tumblr": "http://example.com/jdoe",
    "twitter": "http://example.com/jdoe"
  },
  "styles": [
    "landscape",
    "nature",
    "footage_travel"
  ],
  "subjects": [
    "animals",
    "landmarks",
    "nature",
    "objects",
    "recreation"
  ],
  "website": "http://example.com/profiles/jdoe"
}

Responses

Status Description Schema
200 OK ContributorProfile
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List contributors' collections

curl -X GET "https://api.shutterstock.com/v2/contributors/800506/collections" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const contributorsApi = new sstk.ContributorsApi();

contributorsApi.getContributorCollectionsList("800506")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/contributors/800506/collections",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock contributors get-contributor-collections-list 800506

GET /v2/contributors/{contributor_id}/collections Try it out

This endpoint lists collections based on contributor ID.

Parameters

Parameter Type Description
contributor_id
(Required)
string

Contributor ID

sort string

Sort order

Valid values: newest, last_updated, item_count

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "id": "293542904",
      "name": "My collection",
      "total_item_count": 85,
      "items_updated_time": "2021-05-20T16:15:22-04:00",
      "cover_item": {
        "id": "297886754"
      }
    }
  ],
  "page": 1,
  "per_page": 100,
  "total_count": 1
}

Responses

Status Description Schema
200 OK CollectionDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Contributor not found None

Get details about contributors' collections

curl -X GET "https://api.shutterstock.com/v2/contributors/800506/collections/1991678" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const contributorsApi = new sstk.ContributorsApi();

contributorsApi.getContributorCollections("800506", "1991678")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/contributors/800506/collections/1991678",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock contributors get-contributor-collections 800506  1991678

GET /v2/contributors/{contributor_id}/collections/{id} Try it out

This endpoint gets more detailed information about a contributor's collection, including its cover image, timestamps for its creation, and most recent update. To get the items in collections, use GET /v2/contributors/{contributor_id}/collections/{id}/items.

Parameters

Parameter Type Description
contributor_id
(Required)
string

Contributor ID

id
(Required)
string

Collection ID that belongs to the contributor

Accepted authentication

Example responses

OK

{
  "id": "293542904",
  "name": "My collection",
  "total_item_count": 85,
  "items_updated_time": "2021-05-20T16:15:22-04:00",
  "cover_item": {
    "id": "297886754"
  }
}

Responses

Status Description Schema
200 OK Collection
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Set not found None

Get the items in contributors' collections

curl -X GET "https://api.shutterstock.com/v2/contributors/800506/collections/1991678/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const contributorsApi = new sstk.ContributorsApi();

contributorsApi.getContributorCollectionItems("800506", "1991678")
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/contributors/800506/collections/1991678/items",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock contributors get-contributor-collection-items 800506  1991678

GET /v2/contributors/{contributor_id}/collections/{id}/items Try it out

This endpoint lists the IDs of items in a contributor's collection and the date that each was added.

Parameters

Parameter Type Description
contributor_id
(Required)
string

Contributor ID

id
(Required)
string

Collection ID that belongs to the contributor

page integer

Page number

Minimum: 1

Default: 1

per_page integer

Number of results per page

Minimum: 1

Maximum: 50

Default: 20

sort string

Sort order

Valid values: newest, oldest

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "added_time": "2014-05-01T05:49:46-04:00",
      "id": "168592952",
      "media_type": "image"
    },
    {
      "added_time": "2014-05-01T05:49:59-04:00",
      "id": "88269310",
      "media_type": "image"
    },
    {
      "added_time": "2014-05-01T05:50:21-04:00",
      "id": "94373977",
      "media_type": "image"
    }
  ]
}

Responses

Status Description Schema
200 OK CollectionItemDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None
404 Set not found None

Users

Details

Get user details

curl -X GET "https://api.shutterstock.com/v2/user" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const usersApi = new sstk.UsersApi();

usersApi.getUser()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/user",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock user get-user

GET /v2/user Try it out

Parameters

None.

Accepted authentication

Example responses

OK

{
  "id": "101782699",
  "username": "jdoe",
  "full_name": "John Doe",
  "first_name": "John",
  "last_name": "Doe",
  "language": "es",
  "contributor_id": "212"
}

Responses

Status Description Schema
200 OK UserDetails
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get access token details

curl -X GET "https://api.shutterstock.com/v2/user/access_token" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const usersApi = new sstk.UsersApi();

usersApi.getAccessToken()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/user/access_token",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock user get-access-token

GET /v2/user/access_token Try it out

Parameters

None.

Accepted authentication

Example responses

OK

{
  "client_id": "c456b-26230-fa8ed-d19ab-05ce2-bf0aa",
  "customer_id": "123456789",
  "realm": "customer",
  "user_id": "123456789",
  "username": "jdoe",
  "expires_in": 3600,
  "scopes": [
    "collections.edit",
    "collections.view",
    "licenses.create",
    "licenses.view",
    "purchases.view",
    "user.view"
  ]
}

Responses

Status Description Schema
200 OK AccessTokenDetails
400 Bad Request None
401 Unauthorized None
403 Forbidden None

List user subscriptions

curl -X GET "https://api.shutterstock.com/v2/user/subscriptions" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const usersApi = new sstk.UsersApi();

usersApi.getUserSubscriptionList()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/user/subscriptions",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock user get-user-subscription-list

GET /v2/user/subscriptions Try it out

Parameters

None.

Accepted authentication

Example responses

OK

{
  "data": [
    {
      "allotment": {
        "downloads_left": 5,
        "downloads_limit": 10,
        "end_time": "2020-05-29T12:10:22-05:00",
        "start_time": "2020-05-29T12:10:22-05:00"
      },
      "description": "Annual Subscription",
      "expiration_time": "2020-05-29T12:10:22-05:00",
      "formats": [
        {
          "media_type": "image",
          "description": "Small",
          "format": "jpg",
          "min_resolution": 500,
          "size": "small"
        },
        {
          "media_type": "image",
          "description": "Med",
          "format": "jpg",
          "min_resolution": 1000,
          "size": "medium"
        },
        {
          "media_type": "image",
          "description": "Vector",
          "format": "eps",
          "size": "vector"
        }
      ],
      "id": "s8906043",
      "license": "standard",
      "asset_type": "images",
      "metadata": {}
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

Responses

Status Description Schema
200 OK SubscriptionDataList
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Test

Echo

Echo text

curl -X GET "https://api.shutterstock.com/v2/test" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const testApi = new sstk.TestApi();

testApi.echo()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/test",
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock test echo

GET /v2/test Try it out

Parameters

Parameter Type Description
text string

Text to echo

Default: ok

Accepted authentication

This endpoint does not require authentication.

Example responses

OK

{
  "text": "Test string"
}

Responses

Status Description Schema
200 OK TestEcho
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Validate

Validate input

curl -X GET "https://api.shutterstock.com/v2/test/validate" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN" \
  -G \
  --data-urlencode "id=123"
const sstk = require("shutterstock-api");

sstk.setAccessToken(process.env.SHUTTERSTOCK_API_TOKEN);

const testApi = new sstk.TestApi();

const queryParams = {
  "id": "123",
};

testApi.validate(queryParams)
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });
$queryFields = [
  "id" => "123"
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/test/validate" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer $SHUTTERSTOCK_API_TOKEN"
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
export SHUTTERSTOCK_API_TOKEN="v2/ODYwYmRlNzBiYjMzNTE2M2UyZTQvMTc4NzI2OTM4L2N1c3RvbWVyLzIvWEtXR01HQ1FaVHRLOG85a"

shutterstock test validate \
  --id 123

GET /v2/test/validate Try it out

Parameters

Parameter Type Description
id
(Required)
integer

Integer ID

tag [string]

List of tags

Accepted authentication

This endpoint does not require authentication.

Example responses

OK

{
  "header": {
    "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
  },
  "query": {
    "id": 123456,
    "tag": [
      "Test string"
    ]
  }
}

Responses

Status Description Schema
200 OK TestValidate
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Oauth

Authorization

Authorize applications

curl "https://api.shutterstock.com/v2/oauth/authorize" \
  -X GET \
  -G \
  --data-urlencode "scope=licenses.create licenses.view purchases.view" \
  --data-urlencode "state=demo_`date +%s`" \
  --data-urlencode "response_type=code" \
  --data-urlencode "redirect_uri=http://localhost:3000/callback" \
  --data-urlencode "client_id=$CLIENT_ID"
const axios = require("axios");

axios.get("https://api.shutterstock.com/v2/oauth/authorize", {
  "params": {
    "scope": "licenses.create licenses.view purchases.view",
    "state": "demo_" + Math.round(new Date() / 1000),
    "response_type": "code",
    "redirect_uri": "http://localhost:3000/callback",
    "client_id": clientId
  },
  // Don't follow the redirect because this program is not running in a browser
  "maxRedirects": 0,
})
  .catch(({ response }) => {
    // HTTP 302: Redirect
    console.log(response.data);
  });
$queryFields = [
  "client_id" => $clientId,
  "redirect_uri" => "http://localhost:3000/callback",
  "response_type" => "code",
  "scope" => "licenses.create licenses.view purchases.view",
  "state" => time()
];

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/oauth/authorize?" . http_build_query($queryFields),
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
curl "https://api.shutterstock.com/v2/oauth/authorize" \
  -X GET \
  -G \
  --data-urlencode "scope=licenses.create licenses.view purchases.view" \
  --data-urlencode "state=demo_`date +%s`" \
  --data-urlencode "response_type=code" \
  --data-urlencode "redirect_uri=http://localhost:3000/callback" \
  --data-urlencode "client_id=$CLIENT_ID"

GET /v2/oauth/authorize Try it out

This endpoint returns a redirect URI (in the 'Location' header) that the customer uses to authorize your application and, together with POST /v2/oauth/access_token, generate an access token that represents that authorization.

Parameters

Parameter Type Description
client_id
(Required)
string

Client ID (Consumer Key) of your application

redirect_uri
(Required)
string

The callback URI to send the request to after authorization; must use a host name that is registered with your application

response_type
(Required)
string

Type of temporary authorization code that will be used to generate an access code; the only valid value is 'code'

Valid values: code

state
(Required)
string

Unique value used by the calling app to verify the request

realm string

User type to be authorized (usually 'customer')

Default: customer

Valid values: customer, contributor

scope string

Space-separated list of scopes to be authorized

Default: user.view

Accepted authentication

This endpoint does not require authentication.

Example responses

Redirect user to authenticate with Shutterstock

"Moved temporarily. Redirecting to https://accounts.shutterstock.com/login?next=%2Foauth%2Fauthorize%3Fresponse_type%3Dcode%26state%3D1539619928633%26scope%3Dlicenses.create%20licenses.view%20purchases.view%26client_id%3D6d097450b209c6dcd859%26redirect_uri%3Dhttp%3A%2F%2Flocalhost%3A3000%2Fmyapp%2Fauth%2Fcallback%26realm%3Dcustomer"

Responses

Status Description Schema
302 Redirect user to authenticate with Shutterstock AuthorizeResponse
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Get access tokens

curl "https://api.shutterstock.com/v2/oauth/access_token" \
  -X POST \
  --data-urlencode "client_id=$CLIENT_ID" \
  --data-urlencode "client_secret=$CLIENT_SECRET" \
  --data-urlencode "grant_type=authorization_code" \
  --data-urlencode "code=$CODE"
const axios = require("axios");

const body = {
  "client_id": clientId,
  "client_secret": clientSecret,
  "grant_type": "authorization_code",
  "code": code,
};

axios.post("https://api.shutterstock.com/v2/oauth/access_token", body)
  .then((res) => {
    console.log(res);
  });
$body = [
  "client_id" => $clientId,
  "client_secret" => $clientSecret,
  "grant_type" => "authorization_code",
  "code" => $code
];
$encodedBody = json_encode($body);

$options = [
  CURLOPT_URL => "https://api.shutterstock.com/v2/oauth/access_token",
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $encodedBody,
  CURLOPT_USERAGENT => "php/curl",
  CURLOPT_HTTPHEADER => [
    "Content-Type: application/json",
  ],
  CURLOPT_RETURNTRANSFER => 1
];

$handle = curl_init();
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);

$decodedResponse = json_decode($response);
print_r($decodedResponse);
curl "https://api.shutterstock.com/v2/oauth/access_token" \
  -X POST \
  --data-urlencode "client_id=$CLIENT_ID" \
  --data-urlencode "client_secret=$CLIENT_SECRET" \
  --data-urlencode "grant_type=authorization_code" \
  --data-urlencode "code=$CODE"

POST /v2/oauth/access_token Try it out

This endpoint returns an access token for the specified user and with the specified scopes. The token does not expire until the user changes their password. The body parameters must be encoded as form data.

Parameters

None.

Body

Field Type Description
client_id
(Required)
string

Client ID (Consumer Key) of your application

client_secret string

Client Secret (Consumer Secret) of your application

code string

Response code from the /oauth/authorize flow; required if grant_type=authorization_code

grant_type
(Required)
string

Grant type: authorization_code generates user tokens, client_credentials generates short-lived client grants

Valid values: authorization_code, client_credentials, refresh_token

realm string

User type to be authorized (usually 'customer')

Default: customer

Valid values: customer, contributor

expires boolean

Whether or not the token expires, expiring tokens come with a refresh_token to renew the access_token

refresh_token string

Pass this along with grant_type=refresh_token to get a fresh access token

Accepted authentication

This endpoint does not require authentication.

Example responses

OK

{
  "access_token": "v2/NmQwOTc0NTBiMjA5YzZkY2Q4NTkvMTA4OTg1MDk5L2N1c3RvbWVyLzIvZjB2a0RseGo4Rkt6ZjRmVWJNMm10V2VzcHh1NTBlZWJ6andUQU1NeTVYYnNFTDVWOFRJakItS2RnZTlmbEY1Y3haNWdXLUtYc2JhaXo5djk0V0p2QzZUUWZ4c2FNWm41NkdLYUgyVWlCaVUtQTNVMV9YQWpzd3lpblI3SlZEem8wSG1qQ2NzSkJlX3VQTnNXenBIdkd4SXViVi1rRGJTVENCV0g1U3U0RXRJSV9rSm5lQkl5QXlvbm5JN241UUhv",
  "token_type": "Bearer"
}

Responses

Status Description Schema
200 OK OauthAccessTokenResponse
400 Bad Request None
401 Unauthorized None
403 Forbidden None

Schemas

Schemas describe the format of the data that you send to the API and the data that the API returns. You can use this information to be sure that you are sending the correct data to the API and to configure your application to receive the data in the responses. These schemas can contain other schemas, enumerations, and custom data types such as datestamps. The reference information for each endpoint shows the schema for the response data and the schema for the request body, if the request accepts a body. For more information about the content of schemas, see the Data Models (Schemas) section of the OpenAPI specification.

AccessTokenDetails

Example

{
  "client_id": "c456b-26230-fa8ed-d19ab-05ce2-bf0aa",
  "customer_id": "123456789",
  "realm": "customer",
  "user_id": "123456789",
  "username": "jdoe",
  "expires_in": 3600,
  "scopes": [
    "collections.edit",
    "collections.view",
    "licenses.create",
    "licenses.view",
    "purchases.view",
    "user.view"
  ]
}

Access token details that are currently associated with this user

Properties

Name Type Description
client_id string

Client ID that is associated with the user

contributor_id string

Contributor ID that is associated with the user

customer_id string

Customer ID that is associated with the user

expires_in integer

Number of seconds until the access token expires; no expiration if this value is null

organization_id string

Organization ID that is associated with the user

realm string

Type of access token

Valid values: customer, contributor

scopes [string]

Scopes that this access token provides when used as authentication

user_id string

User ID that is associated with the user

username string

User name that is associated with the user

Album

Example

{
  "id": "1234567",
  "title": "Happy Music"
}

Album metadata

Properties

Name Type Description
id
(Required)
string

The album ID

title
(Required)
string

The album title

Allotment

Example

{
  "downloads_left": 5,
  "downloads_limit": 10,
  "end_time": "2020-05-29T12:10:22-05:00",
  "start_time": "2020-05-29T12:10:22-05:00",
  "content_tiers": {
    "standard_images": {
      "downloads_left": 5,
      "downloads_limit": 10
    },
    "offset": {
      "downloads_left": 9,
      "downloads_limit": 10
    }
  }
}

An allotment of credits as part of a subscription

Properties

Name Type Description
content_tiers object

Downloads left and limit values for each content tier in the license

downloads_left integer

Number of credits remaining in the subscription

downloads_limit integer

Total number of credits available to this subscription

end_time string

Date the subscription ends Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

start_time string

Date the subscription started Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

Artist

Example

{
  "name": "The Happy Tunes Band"
}

Metadata about the artist that created the media

Properties

Name Type Description
name
(Required)
string

The artist's name

Audio

Example

{
  "added_date": "2016-08-16",
  "artists": [
    {
      "name": "Klimenko Music"
    }
  ],
  "assets": {
    "clean_audio": {
      "file_size": 35188408
    },
    "preview_mp3": {
      "file_size": 4400203,
      "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.mp3"
    },
    "preview_ogg": {
      "file_size": 4453197,
      "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.ogg"
    },
    "waveform": {
      "file_size": 18778,
      "url": "https://ak.picdn.net/shutterstock/audio/442583/waveform/waveform.png"
    }
  },
  "bpm": 110,
  "contributor": {
    "id": "2847971"
  },
  "description": "Pulsing and feel-good, featuring soaring synthesizer, groovy synth bass drums and synth drums that create a euphoric, upbeat mood.",
  "duration": 183,
  "genres": [
    "Dance/Electronic",
    "Electro Pop",
    "Pop/Rock"
  ],
  "id": "442583",
  "instruments": [
    "Piano",
    "Synth bass",
    "Synth drums",
    "Synthesizer"
  ],
  "is_adult": false,
  "is_instrumental": true,
  "isrc": "",
  "keywords": [
    "celebratory",
    "chic",
    "euphoric",
    "good times",
    "hip",
    "optimistic",
    "party",
    "soaring",
    "upbeat"
  ],
  "language": "en",
  "lyrics": "",
  "media_type": "audio",
  "moods": [
    "Bright",
    "Confident",
    "Fun",
    "Happy",
    "Inspiring",
    "Optimistic",
    "Playful",
    "Sophisticated",
    "Stylish",
    "Uplifting"
  ],
  "published_time": "2016-08-16T14:30:03-04:00",
  "recording_version": "",
  "releases": [],
  "similar_artists": [],
  "title": "Another Tomorrow",
  "updated_time": "2016-08-18T17:59:33-04:00",
  "vocal_description": "",
  "url": ""
}

Audio metadata

Properties

Name Type Description
contributor
(Required)
Contributor

Information about a contributor

id
(Required)
string

Shutterstock ID of this track

media_type
(Required)
string

Media type of this track; should always be "audio"

added_date string

Date this track was added to the Shutterstock library Format: YYYY-MM-DD
Example: 2020-05-29

affiliate_url string

Affiliate referral link; appears only for registered affiliate partners

album Album

Album metadata

artists [Artist]

List of artists

assets AudioAssets

Files that are available as part of an audio asset

bpm integer

BPM (beats per minute) of this track

deleted_time string

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

description string

Description of this track

duration number

Duration of this track in seconds

genres [string]

List of all genres for this track

instruments [string]

List of all instruments that appear in this track

is_adult boolean

Whether or not this track contains adult content

is_instrumental boolean

Whether or not this track is purely instrumental (lacking lyrics)

isrc string

keywords [string]

List of all keywords for this track

language string

Language of this track's lyrics

lyrics string

Lyrics of this track

model_releases [ModelRelease]

List of all model releases for this track

moods [string]

List of all moods of this track

published_time string

Time this track was published Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

recording_version string

Recording version of this track

releases [string]

List of all releases of this track

similar_artists [Artist]

List of all similar artists of this track

submitted_time string

Time this track was submitted Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

title string

Title of this track

updated_time string

Time this track was last updated Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

url string

vocal_description string

Vocal description of this track

AudioAssetDetails

Example

{
  "file_size": 4453197,
  "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.mp3"
}

Information about a file that is part of an audio asset

Properties

Name Type Description
file_size integer

File size of the track

url string

URL the track is available at

AudioAssets

Example

{
  "clean_audio": {
    "file_size": 35188408
  },
  "preview_mp3": {
    "file_size": 4400203,
    "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.mp3"
  },
  "preview_ogg": {
    "file_size": 4453197,
    "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.ogg"
  },
  "waveform": {
    "file_size": 18778,
    "url": "https://ak.picdn.net/shutterstock/audio/442583/waveform/waveform.png"
  }
}

Files that are available as part of an audio asset

Properties

Name Type Description
album_art AudioAssetDetails

Information about a file that is part of an audio asset

clean_audio AudioAssetDetails

Information about a file that is part of an audio asset

original_audio AudioAssetDetails

Information about a file that is part of an audio asset

preview_mp3 AudioAssetDetails

Information about a file that is part of an audio asset

preview_ogg AudioAssetDetails

Information about a file that is part of an audio asset

shorts_loops_stems ShortsLoopsStems

Links for Shorts, Loops and Stems previews

waveform AudioAssetDetails

Information about a file that is part of an audio asset

AudioDataList

Example

{
  "data": [
    {
      "added_date": "2016-04-12",
      "artists": [
        {
          "name": "Fin Productions"
        }
      ],
      "assets": {
        "clean_audio": {
          "file_size": 30760372
        },
        "preview_mp3": {
          "file_size": 3846606,
          "url": "https://ak.picdn.net/shutterstock/audio/434750/preview/preview.mp3"
        },
        "preview_ogg": {
          "file_size": 4402608,
          "url": "https://ak.picdn.net/shutterstock/audio/434750/preview/preview.ogg"
        },
        "waveform": {
          "file_size": 19822,
          "url": "https://ak.picdn.net/shutterstock/audio/434750/waveform/waveform.png"
        }
      },
      "bpm": 100,
      "contributor": {
        "id": "2847971"
      },
      "description": "Pulsing and feel-good, featuring slick electric guitar, synthesizer, bass, electronic drum pads and drums that create a positive, celebratory mood.",
      "duration": 160,
      "genres": [
        "Dance/Electronic",
        "Electro Pop",
        "Pop/Rock"
      ],
      "id": "434750",
      "instruments": [
        "Bass",
        "Drums",
        "Electric guitar",
        "Pads",
        "Percussion",
        "Synthesizer"
      ],
      "is_adult": false,
      "is_instrumental": true,
      "isrc": "",
      "keywords": [
        "breezy",
        "celebration",
        "festive",
        "good times",
        "hopeful",
        "optimistic",
        "party",
        "positive",
        "reflective"
      ],
      "language": "en",
      "lyrics": "",
      "media_type": "audio",
      "moods": [
        "Bright",
        "Confident",
        "Fun",
        "Happy",
        "Inspiring",
        "Optimistic",
        "Playful",
        "Sophisticated",
        "Stylish",
        "Uplifting"
      ],
      "published_time": "2016-04-12T17:45:29-04:00",
      "recording_version": "",
      "releases": [],
      "similar_artists": [],
      "title": "Fresh Love",
      "updated_time": "2016-08-18T18:03:11-04:00",
      "vocal_description": ""
    }
  ]
}

List of tracks

Properties

Name Type Description
data [Audio]

Tracks

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

total_count integer

Total count of all results across all pages

AudioSearchResults

Example

{
  "data": [
    {
      "added_date": "2016-08-16",
      "artists": [
        {
          "name": "Klimenko Music"
        }
      ],
      "assets": {
        "clean_audio": {
          "file_size": 35188408
        },
        "preview_mp3": {
          "file_size": 4400203,
          "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.mp3"
        },
        "preview_ogg": {
          "file_size": 4453197,
          "url": "https://ak.picdn.net/shutterstock/audio/442583/preview/preview.ogg"
        },
        "waveform": {
          "file_size": 18778,
          "url": "https://ak.picdn.net/shutterstock/audio/442583/waveform/waveform.png"
        }
      },
      "bpm": 110,
      "contributor": {
        "id": "2847971"
      },
      "description": "Pulsing and feel-good, featuring soaring synthesizer, groovy synth bass drums and synth drums that create a euphoric, upbeat mood.",
      "duration": 183,
      "genres": [
        "Dance/Electronic",
        "Electro Pop",
        "Pop/Rock"
      ],
      "id": "442583",
      "instruments": [
        "Piano",
        "Synth bass",
        "Synth drums",
        "Synthesizer"
      ],
      "is_adult": false,
      "is_instrumental": true,
      "isrc": "",
      "keywords": [
        "celebratory",
        "chic",
        "euphoric",
        "good times",
        "hip",
        "optimistic",
        "party",
        "soaring",
        "upbeat"
      ],
      "language": "en",
      "lyrics": "",
      "media_type": "audio",
      "moods": [
        "Bright",
        "Confident",
        "Fun",
        "Happy",
        "Inspiring",
        "Optimistic",
        "Playful",
        "Sophisticated",
        "Stylish",
        "Uplifting"
      ],
      "published_time": "2016-08-16T14:30:03-04:00",
      "recording_version": "",
      "releases": [],
      "similar_artists": [],
      "title": "Another Tomorrow",
      "updated_time": "2016-08-18T17:59:33-04:00",
      "vocal_description": "",
      "url": ""
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455,
  "search_id": "749090bb-2967-4a20-b22e-c800dc845e10"
}

Audio search results

Properties

Name Type Description
data
(Required)
[Audio]

List of tracks

search_id
(Required)
string

ID of the search

total_count
(Required)
integer

Total count of all results across all pages

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

AudioUrl

Example

{
  "$ref": "#/components/schemas/Url/example"
}

Audio License URL object

Properties

Name Type Description
url
(Required)
string

URL that can be used to download the unwatermarked, licensed asset

shorts_loops_stems string

URL that can be used to download the .zip file containing shorts, loops, and stems

AuthorizeResponse

Example

"Moved temporarily. Redirecting to https://accounts.shutterstock.com/login?next=%2Foauth%2Fauthorize%3Fresponse_type%3Dcode%26state%3D1539619928633%26scope%3Dlicenses.create%20licenses.view%20purchases.view%26client_id%3D6d097450b209c6dcd859%26redirect_uri%3Dhttp%3A%2F%2Flocalhost%3A3000%2Fmyapp%2Fauth%2Fcallback%26realm%3Dcustomer"

HTML redirect URL that contains the application authorization 'code'

BulkImageSearchRequest

Example

[
  {
    "query": "cat",
    "license": [
      "editorial"
    ],
    "sort": "popular"
  },
  {
    "query": "dog",
    "orientation": "horizontal"
  }
]

List of searches

Properties

Name Type Description
  [SearchImage]

List of searches

BulkImageSearchResults

Example

{
  "results": [
    {
      "data": [
        {
          "id": "1572478477",
          "aspect": 1.5,
          "assets": {
            "preview": {
              "height": 300,
              "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
              "width": 450
            },
            "small_thumb": {
              "height": 67,
              "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
              "width": 100
            },
            "large_thumb": {
              "height": 100,
              "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
              "width": 150
            },
            "mosaic": {
              "height": 167,
              "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-250nw-1572478477.jpg",
              "width": 250
            },
            "huge_thumb": {
              "height": 260,
              "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
              "width": 390
            },
            "preview_1000": {
              "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
              "width": 1000,
              "height": 667
            },
            "preview_1500": {
              "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
              "width": 1500,
              "height": 1000
            }
          },
          "contributor": {
            "id": "250738318"
          },
          "description": "cropped image of woman gardening",
          "image_type": "photo",
          "has_model_release": true,
          "media_type": "image"
        }
      ],
      "page": 1,
      "per_page": 5,
      "search_id": "749090bb-2967-4a20-b22e-c800dc845e10",
      "spellcheck_info": {},
      "total_count": 45
    },
    {
      "data": [],
      "page": 1,
      "per_page": 5,
      "search_id": "749090bb-2967-4a20-b22e-c800dc845e11",
      "spellcheck_info": {},
      "total_count": 0
    }
  ]
}

List of search results for each given query

Properties

Name Type Description
bulk_search_id string

Unique identifier for the search request

results [ImageSearchResults]

List of image search results

CatalogCollection

Example

{
  "id": "126351028",
  "name": "My collection",
  "cover_asset": {
    "id": "123",
    "asset": {
      "id": "1690105108",
      "type": "image",
      "name": "Young couple playing tennis at the court"
    },
    "created_time": "2021-06-10T13:26:09-04:00"
  },
  "total_item_count": 2,
  "created_time": "2021-05-20T16:15:22-04:00",
  "updated_time": "2021-06-10T13:26:09-04:00",
  "visibility": "public",
  "role_assignments": {
    "collection_id": "126351028",
    "roles": {
      "owners": [
        {
          "id": "321",
          "type": "USER",
          "email": "userOne@org.com"
        }
      ],
      "editors": [
        {
          "id": "987",
          "type": "USER",
          "email": "userTwo@org.com"
        }
      ],
      "viewers": []
    }
  }
}

Catalog collection

Properties

Name Type Description
created_time
(Required)
string

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

id
(Required)
string

name
(Required)
string

role_assignments
(Required)
CatalogCollectionRoleAssignments

List of role assignments for a catalog collection

total_item_count
(Required)
number

updated_time
(Required)
string

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

visibility
(Required)
string

Valid values: private, public

cover_asset CatalogCollectionItem

Metadata about an item that is part of a collection

CatalogCollectionDataList

Example

{
  "page": 1,
  "per_page": 20,
  "total_count": 1,
  "data": [
    {
      "id": "126351028",
      "name": "My collection",
      "cover_asset": {
        "id": "123",
        "asset": {
          "id": "1690105108",
          "type": "image",
          "name": "Young couple playing tennis at the court"
        },
        "created_time": "2021-06-10T13:26:09-04:00"
      },
      "total_item_count": 2,
      "created_time": "2021-05-20T16:15:22-04:00",
      "updated_time": "2021-06-10T13:26:09-04:00",
      "visibility": "public",
      "role_assignments": {
        "collection_id": "126351028",
        "roles": {
          "owners": [
            {
              "id": "321",
              "type": "USER",
              "email": "userOne@org.com"
            }
          ],
          "editors": [
            {
              "id": "987",
              "type": "USER",
              "email": "userTwo@org.com"
            }
          ],
          "viewers": []
        }
      }
    }
  ]
}

List of catalog collections

Properties

Name Type Description
data
(Required)
[CatalogCollection]

List of catalog collections

page
(Required)
number

per_page
(Required)
number

total_count
(Required)
number

CatalogCollectionItem

Example

{
  "id": "123",
  "asset": {
    "id": "1690105108",
    "type": "image",
    "name": "Young couple playing tennis at the court"
  },
  "created_time": "2021-06-10T13:26:09-04:00",
  "collection_ids": [
    "126351028"
  ]
}

Metadata about an item that is part of a collection

Properties

Name Type Description
asset
(Required)
object

created_time
(Required)
string

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

id
(Required)
string

collection_ids [string]

The collection IDs that this asset belongs to

CatalogCollectionItemDataList

Example

{
  "page": 1,
  "per_page": 1,
  "total_count": 82,
  "data": [
    {
      "id": "123",
      "asset": {
        "id": "1690105108",
        "type": "image",
        "name": "Young couple playing tennis at the court"
      },
      "created_time": "2021-06-10T13:26:09-04:00",
      "collection_ids": [
        "126351028"
      ]
    }
  ]
}

List of catalog collection items

Properties

Name Type Description
data
(Required)
[CatalogCollectionItem]

List of catalog collection items

page
(Required)
number

per_page
(Required)
number

total_count
(Required)
number

CatalogCollectionRole

Example

{
  "id": "123",
  "type": "USER",
  "email": "user123@org.com"
}

A user that has access to a catalog collection

Properties

Name Type Description
email
(Required)
string

id
(Required)
string

type
(Required)
string

Valid values: USER

CatalogCollectionRoleAssignments

Example

{
  "collection_id": "126351028",
  "roles": {
    "owners": [
      {
        "id": "321",
        "type": "USER",
        "email": "userOne@org.com"
      }
    ],
    "editors": [
      {
        "id": "987",
        "type": "USER",
        "email": "userTwo@org.com"
      }
    ],
    "viewers": []
  }
}

List of role assignments for a catalog collection

Properties

Name Type Description
collection_id
(Required)
string

roles
(Required)
object

Category

Example

{
  "id": "1",
  "name": "Animals/Wildlife"
}

Category information

Properties

Name Type Description
id string

Category ID

name string

Category name

CategoryDataList

Example

{
  "data": [
    {
      "id": "1",
      "name": "Animals/Wildlife"
    },
    {
      "id": "11",
      "name": "The Arts"
    }
  ],
  "page": 1,
  "per_page": 2,
  "total_count": 13
}

List of categories that images can belong to

Properties

Name Type Description
data [Category]

Categories

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

The current page of results

per_page integer

The number of results per page

total_count integer

The total number of results across all pages

Collection

Example

{
  "id": "293542904",
  "name": "My collection",
  "total_item_count": 85,
  "items_updated_time": "2021-05-20T16:15:22-04:00",
  "cover_item": {
    "id": "297886754"
  }
}

Metadata about a collection of assets

Properties

Name Type Description
id
(Required)
string

The collection ID

name
(Required)
string

The name of the collection

total_item_count
(Required)
integer

The number of items in the collection

cover_item CollectionItem

Metadata about an item that is part of a collection

created_time string

When the collection was created Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

items_updated_time string

The last time this collection's items were updated Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

share_code string

A code that can be used to share the collection (optional)

share_url string

The browser URL that can be used to share the collection (optional)

updated_time string

The last time the collection was update (other than changes to the items in it) Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

CollectionCreateRequest

Example

{
  "name": "Test Collection 19cf"
}

Collection creation request

Properties

Name Type Description
name
(Required)
string

The name of the collection

CollectionCreateResponse

Example

{
  "id": "48433105"
}

Collection creation response

Properties

Name Type Description
id
(Required)
string

ID of the new collection

CollectionDataList

Example

{
  "data": [
    {
      "id": "293542904",
      "name": "My collection",
      "total_item_count": 85,
      "items_updated_time": "2021-05-20T16:15:22-04:00",
      "cover_item": {
        "id": "297886754"
      }
    }
  ],
  "page": 1,
  "per_page": 100,
  "total_count": 1
}

List of collections

Properties

Name Type Description
data [Collection]

Collections

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

The current page of results

per_page integer

The number of results per page

total_count integer

The total number of results across all pages

CollectionItem

Example

{
  "added_time": "2020-05-29T12:10:22-05:00",
  "id": "1690105108",
  "media_type": "image"
}

Metadata about an item that is part of a collection

Properties

Name Type Description
id
(Required)
string

ID of the item

added_time string

The date the item was added to the collection Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

media_type string

The media type of the item, such as image, video, or audio

CollectionItemDataList

Example

{
  "data": [
    {
      "id": "1690105108",
      "added_time": "2021-07-08T12:33:37.000Z",
      "media_type": "image"
    },
    {
      "id": "1468703072",
      "added_time": "2021-07-08T12:31:43.000Z",
      "media_type": "image"
    }
  ],
  "page": 1,
  "per_page": 2,
  "total_count": 82
}

List of items in a collection

Properties

Name Type Description
data [CollectionItem]

Assets in the collection

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

The current page of results

per_page integer

The number of results per page

total_count integer

The total number of results across all pages

CollectionItemRequest

Example

{
  "items": [
    {
      "added_time": "2020-05-29T12:10:22-05:00",
      "id": "1690105108",
      "media_type": "image"
    }
  ]
}

Request to get a list of items in a collection

Properties

Name Type Description
items
(Required)
[CollectionItem]

List of items

CollectionUpdateRequest

Example

{
  "name": "My collection with a new name"
}

Collection update request

Properties

Name Type Description
name
(Required)
string

The new name of the collection

ComputerVisionImageCreateResponse

Example

{
  "upload_id": "Udb14e1c3540bdbf82b4b3fe12d3a44f2"
}

Asset upload information

Properties

Name Type Description
upload_id
(Required)
string

Contributor

Example

{
  "id": "12345678"
}

Information about a contributor

Properties

Name Type Description
id
(Required)
string

ID of the contributor

ContributorProfile

Example

{
  "about": "John Doe's photographs",
  "contributor_type": [
    "photographer"
  ],
  "display_name": "John Doe",
  "equipment": [
    "Nikon",
    "Fuji"
  ],
  "id": "12345678",
  "location": "US",
  "portfolio_url": "https://www.shutterstock.com/g/jdoe",
  "social_media": {
    "facebook": "http://example.com/jdoe",
    "google_plus": "http://example.com/jdoe",
    "linkedin": "http://example.com/jdoe",
    "pinterest": "http://example.com/jdoe",
    "tumblr": "http://example.com/jdoe",
    "twitter": "http://example.com/jdoe"
  },
  "styles": [
    "landscape",
    "nature",
    "footage_travel"
  ],
  "subjects": [
    "animals",
    "landmarks",
    "nature",
    "objects",
    "recreation"
  ],
  "website": "http://example.com/profiles/jdoe"
}

Contributor profile data

Properties

Name Type Description
id
(Required)
string

Contributor ID

about string

Short description of the contributors' library

contributor_type [string]

Type of content that the contributor specializes in (photographer, illustrator, etc)

display_name string

Preferred name to be displayed for the contributor

equipment [string]

List of equipment used by the contributor (Canon EOS 5D Mark II, etc)

location string

Country code representing the contributor's locale

portfolio_url string

Web URL for the contributors' profile

social_media ContributorProfileSocialMedia

Contributor profile social media links

styles [string]

List of styles that the contributor specializes in (lifestyle, mixed media, etc)

subjects [string]

Generic list of subjects for contributors' work (food_and_drink, holiday, people, etc)

website string

Personal website for the contributor

ContributorProfileDataList

Example

{
  "data": [
    {
      "about": "John Doe's photographs",
      "contributor_type": [
        "photographer"
      ],
      "display_name": "John Doe",
      "equipment": [
        "Nikon",
        "Fuji"
      ],
      "id": "12345678",
      "location": "US",
      "portfolio_url": "https://www.shutterstock.com/g/jdoe",
      "social_media": {
        "facebook": "http://example.com/jdoe",
        "google_plus": "http://example.com/jdoe",
        "linkedin": "http://example.com/jdoe",
        "pinterest": "http://example.com/jdoe",
        "tumblr": "http://example.com/jdoe",
        "twitter": "http://example.com/jdoe"
      },
      "styles": [
        "landscape",
        "nature",
        "footage_travel"
      ],
      "subjects": [
        "animals",
        "landmarks",
        "nature",
        "objects",
        "recreation"
      ],
      "website": "http://example.com/profiles/jdoe"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 15
}

List of contributor profiles

Properties

Name Type Description
data [ContributorProfile]

Conributor profiles

errors [Error]

Error list; appears only if there was an error

message string

Error message

page integer

Page of response

per_page integer

Number of contributors per page

total_count integer

Total count of contributors for this request

ContributorProfileSocialMedia

Example

{
  "facebook": "http://example.com/jdoe",
  "google_plus": "http://example.com/jdoe",
  "linkedin": "http://example.com/jdoe",
  "pinterest": "http://example.com/jdoe",
  "tumblr": "http://example.com/jdoe",
  "twitter": "http://example.com/jdoe"
}

Contributor profile social media links

Properties

Name Type Description
facebook string

Facebook link for contributor

google_plus string

Google+ link for contributor

linkedin string

LinkedIn link for contributor

pinterest string

Pinterest page for contributor

tumblr string

Tumblr link for contributor

twitter string

Twitter link for contributor

Example

{
  "name": "The name of the cookie",
  "value": "The value of the cookie"
}

Cookie object

Properties

Name Type Description
name
(Required)
string

The name of the cookie

value
(Required)
string

The value of the cookie

CreateCatalogCollection

Example

{
  "name": "New Collection",
  "visibility": "public",
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
}

Properties

Name Type Description
name
(Required)
string

Minimum length: 1

Maximum length: 100000

items [CreateCatalogCollectionItem]

Maximum length: 50

visibility string

Default: private

Valid values: private, public

CreateCatalogCollectionItem

Example

{
  "asset": {
    "id": "1690105108",
    "type": "image"
  }
}

Properties

Name Type Description
asset
(Required)
object

CreateCatalogCollectionItems

Example

{
  "items": [
    {
      "asset": {
        "id": "1690105108",
        "type": "image"
      }
    }
  ]
}

Properties

Name Type Description
items
(Required)
[CreateCatalogCollectionItem]

Minimum length: 1

Maximum length: 50

CustomSizeDimensions

Example

{
  "height": 600,
  "width": 800
}

A custom height or a custom width to resize the image to, but not both (experimental)

Properties

Name Type Description
height integer

Custom height to resize the image to

Minimum: 100

width integer

Custom width to resize the image to

Minimum: 100

DownloadHistory

Example

{
  "id": "a24499ca3ccd912a6d8316d45f953ef092",
  "user": {
    "username": "jdoe"
  },
  "license": "standard",
  "download_time": "2021-05-20T20:31:46.000Z",
  "is_downloadable": true,
  "image": {
    "id": "1234567",
    "format": {
      "size": "medium"
    }
  },
  "subscription_id": "s12345678"
}

Information about a downloaded media item. Applicable for all media types, only one of 'audio', 'image' or 'video' will be in a single DownloadHistory object

Properties

Name Type Description
download_time
(Required)
string

Date the media was downloaded the first time Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

id
(Required)
string

ID of the download

license
(Required)
string

The name of the license of this download

audio DownloadHistoryMediaDetails

Information about the downloaded media

image DownloadHistoryMediaDetails

Information about the downloaded media

is_downloadable boolean

Specifies if the media is downloadable via its respective downloads endpoint

metadata object

The metadata that was passed in the original licensing request

revshare DownloadHistoryRevshareDetails

Pricing information for revenue-sharing transactions

subscription_id string

ID of the subscription used to perform this download

user DownloadHistoryUserDetails

Information about a user

video DownloadHistoryMediaDetails

Information about the downloaded media

DownloadHistoryDataList

Example

{
  "total_count": 2890,
  "page": 1,
  "per_page": 1,
  "data": [
    {
      "id": "e1eba3833793e77188d22caae8bac9f2cd",
      "user": {
        "username": "editorial_test_account_002"
      },
      "license": "premier_editorial_all_digital",
      "download_time": "2021-07-15T15:46:34.000Z",
      "is_downloadable": false,
      "image": {
        "id": "9763363ao",
        "format": {
          "size": "original"
        }
      },
      "subscription_id": "s12345678",
      "metadata": {
        "purchase_order": "123456",
        "client": "Company A",
        "job": "Important project",
        "other": "Important media"
      }
    }
  ]
}

List of download events

Properties

Name Type Description
data [DownloadHistory]

Download events

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

The current page of results

per_page integer

The number of results per page

total_count integer

The total number of results across all pages

DownloadHistoryFormatDetails

Example

{
  "format": "jpg",
  "size": "medium"
}

Information about the format of a download

Properties

Name Type Description
format string

The format of the downloaded media

size string

The size of the downloaded media

DownloadHistoryMediaDetails

Example

{
  "format": {
    "format": "jpg",
    "size": "medium"
  },
  "id": "1234567"
}

Information about the downloaded media

Properties

Name Type Description
id
(Required)
string

ID of the download history media details

format DownloadHistoryFormatDetails

Information about the format of a download

DownloadHistoryRevshareDetails

Example

{
  "purchase_amount": "8.65",
  "purchase_currency": "USD"
}

Pricing information for revenue-sharing transactions

Properties

Name Type Description
purchase_amount
(Required)
string

The amount charged for the license

purchase_currency
(Required)
string

The currency the amount was charged in

DownloadHistoryUserDetails

Example

{
  "username": "jdoe"
}

Information about a user

Properties

Name Type Description
username
(Required)
string

The name of the user who downloaded the item

EditorialAssets

Example

{
  "thumb_170": {
    "height": 105,
    "width": 170,
    "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
  },
  "thumb_220": {
    "height": 136,
    "width": 220,
    "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
  },
  "watermark_450": {
    "height": 278,
    "width": 450,
    "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
  },
  "watermark_1500": {
    "height": 926,
    "width": 1500,
    "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
  },
  "small_jpg": {
    "display_name": "Small",
    "width": 500,
    "height": 309,
    "is_licensable": true
  },
  "medium_jpg": {
    "display_name": "Med",
    "width": 1000,
    "height": 617,
    "is_licensable": true
  },
  "original": {
    "display_name": "Original",
    "height": 3693,
    "width": 5985,
    "is_licensable": true
  }
}

Asset information, including size and thumbnail URLs

Properties

Name Type Description
medium_jpg ImageSizeDetails

Image size information

original ImageSizeDetails

Image size information

small_jpg ImageSizeDetails

Image size information

thumb_170 Thumbnail

Image thumbnail information

thumb_220 Thumbnail

Image thumbnail information

watermark_1500 Thumbnail

Image thumbnail information

watermark_450 Thumbnail

Image thumbnail information

EditorialCategory

Example

{
  "name": "Awards"
}

Name of an editorial category

Properties

Name Type Description
name string

EditorialCategoryResults

Example

{
  "data": [
    {
      "name": "Animal"
    },
    {
      "name": "Awards"
    },
    {
      "name": "Art"
    }
  ]
}

List of editorial categories

Properties

Name Type Description
data [EditorialCategory]

List of editorial categories

EditorialContent

Example

{
  "id": "10687730b",
  "title": "Soccer Premier League, Manchester, United Kingdom - 11 May 2021",
  "caption": "",
  "description": "Security and stewards stand outside the Old Trafford stadium in Manchester, England, ahead of the English Premier League soccer match between Manchester United and Leicester City. This is the first Manchester United home match since fans protested against American owner Joel Glazer, forcing the postponement of the team's Premier League game against Liverpool. The protests prompted Glazer to publish a letter in which he pledged to accelerate discussions with fans about supporters being able to have a greater say at the club",
  "byline": "Jon Super/AP/Shutterstock",
  "keywords": [
    "england",
    "europe",
    "leicester city fc",
    "manchester",
    "manchester united fc",
    "men's soccer",
    "men's sports",
    "premier league",
    "professional soccer",
    "soccer",
    "sports",
    "united kingdom",
    "western europe",
    "wsoc"
  ],
  "date_taken": "2021-05-11",
  "categories": [
    {
      "name": "Sport"
    }
  ],
  "aspect": 1.621,
  "assets": {
    "thumb_170": {
      "height": 105,
      "width": 170,
      "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
    },
    "thumb_220": {
      "height": 136,
      "width": 220,
      "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
    },
    "watermark_450": {
      "height": 278,
      "width": 450,
      "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
    },
    "watermark_1500": {
      "height": 926,
      "width": 1500,
      "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
    },
    "small_jpg": {
      "display_name": "Small",
      "width": 500,
      "height": 309,
      "is_licensable": true
    },
    "medium_jpg": {
      "display_name": "Med",
      "width": 1000,
      "height": 617,
      "is_licensable": true
    },
    "original": {
      "display_name": "Original",
      "height": 3693,
      "width": 5985,
      "is_licensable": true
    }
  }
}

Metadata about editorial content

Properties

Name Type Description
id
(Required)
string

aspect number

assets EditorialAssets

Asset information, including size and thumbnail URLs

byline string

caption string

categories [EditorialCategory]

List of categories

date_taken string

Format: YYYY-MM-DD
Example: 2020-05-29

description string

keywords [string]

special_instructions string

title string

EditorialContentDataList

Example

{
  "data": [
    {
      "id": "10687730b",
      "title": "Soccer Premier League, Manchester, United Kingdom - 11 May 2021",
      "caption": "",
      "description": "Security and stewards stand outside the Old Trafford stadium in Manchester, England, ahead of the English Premier League soccer match between Manchester United and Leicester City. This is the first Manchester United home match since fans protested against American owner Joel Glazer, forcing the postponement of the team's Premier League game against Liverpool. The protests prompted Glazer to publish a letter in which he pledged to accelerate discussions with fans about supporters being able to have a greater say at the club",
      "byline": "Jon Super/AP/Shutterstock",
      "keywords": [
        "england",
        "europe",
        "leicester city fc",
        "manchester",
        "manchester united fc",
        "men's soccer",
        "men's sports",
        "premier league",
        "professional soccer",
        "soccer",
        "sports",
        "united kingdom",
        "western europe",
        "wsoc"
      ],
      "date_taken": "2021-05-11",
      "categories": [
        {
          "name": "Sport"
        }
      ],
      "aspect": 1.621,
      "assets": {
        "thumb_170": {
          "height": 105,
          "width": 170,
          "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
        },
        "thumb_220": {
          "height": 136,
          "width": 220,
          "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
        },
        "watermark_450": {
          "height": 278,
          "width": 450,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
        },
        "watermark_1500": {
          "height": 926,
          "width": 1500,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
        },
        "small_jpg": {
          "display_name": "Small",
          "width": 500,
          "height": 309,
          "is_licensable": true
        },
        "medium_jpg": {
          "display_name": "Med",
          "width": 1000,
          "height": 617,
          "is_licensable": true
        },
        "original": {
          "display_name": "Original",
          "height": 3693,
          "width": 5985,
          "is_licensable": true
        }
      }
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 16
}

List of editorial items

Properties

Name Type Description
data [EditorialContent]

Editorial items

errors [Error]

Error list; appears only if there was an error

message string

Optional error message

page integer

Current page of the response

per_page integer

Number of results per page

total_count integer

Total count of all results

EditorialCoverItem

Example

{
  "height": 117,
  "width": 170,
  "url": "https://editorial01.qa.shuttercorp.net/thumb/9763363q/51e28f39/Shutterstock_9763363q.jpg",
  "id": "9763363q"
}

Cover image for editorial livefeed

Properties

Name Type Description
id
(Required)
string

url
(Required)
string

height integer

width integer

EditorialImageCategoryResults

Example

{
  "data": [
    {
      "name": "Animal"
    },
    {
      "name": "Awards"
    },
    {
      "name": "Art"
    },
    {
      "name": "Film Stills"
    }
  ]
}

List of editorial categories

Properties

Name Type Description
data [EditorialCategory]

Name of an editorial category

EditorialImageContentDataList

Example

{
  "data": [
    {
      "id": "10687730b",
      "title": "Soccer Premier League, Manchester, United Kingdom - 11 May 2021",
      "caption": "",
      "description": "Security and stewards stand outside the Old Trafford stadium in Manchester, England, ahead of the English Premier League soccer match between Manchester United and Leicester City. This is the first Manchester United home match since fans protested against American owner Joel Glazer, forcing the postponement of the team's Premier League game against Liverpool. The protests prompted Glazer to publish a letter in which he pledged to accelerate discussions with fans about supporters being able to have a greater say at the club",
      "byline": "Jon Super/AP/Shutterstock",
      "keywords": [
        "england",
        "europe",
        "leicester city fc",
        "manchester",
        "manchester united fc",
        "men's soccer",
        "men's sports",
        "premier league",
        "professional soccer",
        "soccer",
        "sports",
        "united kingdom",
        "western europe",
        "wsoc"
      ],
      "date_taken": "2021-05-11",
      "categories": [
        {
          "name": "Sport"
        }
      ],
      "aspect": 1.621,
      "assets": {
        "thumb_170": {
          "height": 105,
          "width": 170,
          "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
        },
        "thumb_220": {
          "height": 136,
          "width": 220,
          "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
        },
        "watermark_450": {
          "height": 278,
          "width": 450,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
        },
        "watermark_1500": {
          "height": 926,
          "width": 1500,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
        },
        "small_jpg": {
          "display_name": "Small",
          "width": 500,
          "height": 309,
          "is_licensable": true
        },
        "medium_jpg": {
          "display_name": "Med",
          "width": 1000,
          "height": 617,
          "is_licensable": true
        },
        "original": {
          "display_name": "Original",
          "height": 3693,
          "width": 5985,
          "is_licensable": true
        }
      }
    }
  ],
  "page": 1,
  "per_page": 1,
  "total_count": 23
}

List of editorial items

Properties

Name Type Description
data [EditorialContent]

Editorial items

errors [Error]

Error list; appears only if there was an error

message string

Optional error message

page integer

Current page of the response

per_page integer

Number of results per page

total_count integer

Total count of all results

EditorialImageLivefeed

Example

{
  "id": "2018%2F07%2F17%2FPrince%20Charles%20and%20Camilla%20Duchess%20of%20Cornwall%20visit%20to%20Cornwall%2C%20Day%202",
  "name": "Prince Charles and Camilla Duchess of Cornwall visit to Cornwall, Day 2",
  "total_item_count": 38,
  "created_time": "2018-07-17T12:42:03+00:00",
  "cover_item": {
    "height": 117,
    "width": 170,
    "url": "https://editorial01.qa.shuttercorp.net/thumb/9763363q/51e28f39/Shutterstock_9763363q.jpg",
    "id": "9763363q"
  }
}

Metadata about editorial livefeed

Properties

Name Type Description
id
(Required)
string

Livefeed ID

name
(Required)
string

Name of the livefeed

total_item_count
(Required)
integer

Total count of items in the livefeed

cover_item EditorialCoverItem

Cover image for editorial livefeed

created_time string

When the livefeed was initially created Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

EditorialImageLivefeedList

Example

{
  "page": 1,
  "per_page": 1,
  "total_count": 5300,
  "data": [
    {
      "id": "2018%2F07%2F17%2FPrince%20Charles%20and%20Camilla%20Duchess%20of%20Cornwall%20visit%20to%20Cornwall%2C%20Day%202",
      "name": "Prince Charles and Camilla Duchess of Cornwall visit to Cornwall, Day 2",
      "total_item_count": 38,
      "created_time": "2018-07-17T12:42:03+00:00",
      "cover_item": {
        "height": 117,
        "width": 170,
        "url": "https://editorial01.qa.shuttercorp.net/thumb/9763363q/51e28f39/Shutterstock_9763363q.jpg",
        "id": "9763363q"
      }
    }
  ]
}

List of editorial livefeeds

Properties

Name Type Description
data
(Required)
[EditorialLivefeed]

Editorial livefeeds

total_count
(Required)
integer

Total count of all results

message string

Optional error message

page integer

Current page of the response

per_page integer

Number of results per page

EditorialLivefeed

Example

{
  "id": "2018%2F07%2F17%2FPrince%20Charles%20and%20Camilla%20Duchess%20of%20Cornwall%20visit%20to%20Cornwall%2C%20Day%202",
  "name": "Prince Charles and Camilla Duchess of Cornwall visit to Cornwall, Day 2",
  "total_item_count": 38,
  "created_time": "2018-07-17T12:42:03+00:00",
  "cover_item": {
    "height": 117,
    "width": 170,
    "url": "https://editorial01.qa.shuttercorp.net/thumb/9763363q/51e28f39/Shutterstock_9763363q.jpg",
    "id": "9763363q"
  }
}

Metadata about editorial livefeed

Properties

Name Type Description
id
(Required)
string

Livefeed ID

name
(Required)
string

Name of the livefeed

total_item_count
(Required)
integer

Total count of items in the livefeed

cover_item EditorialCoverItem

Cover image for editorial livefeed

created_time string

When the livefeed was initially created Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

EditorialLivefeedList

Example

{
  "data": [
    {
      "id": "2018%2F07%2F17%2FPrince%20Charles%20and%20Camilla%20Duchess%20of%20Cornwall%20visit%20to%20Cornwall%2C%20Day%202",
      "name": "Prince Charles and Camilla Duchess of Cornwall visit to Cornwall, Day 2",
      "total_item_count": 38,
      "created_time": "2018-07-17T12:42:03+00:00",
      "cover_item": {
        "height": 117,
        "width": 170,
        "url": "https://editorial01.qa.shuttercorp.net/thumb/9763363q/51e28f39/Shutterstock_9763363q.jpg",
        "id": "9763363q"
      }
    }
  ],
  "page": 1,
  "per_page": 1,
  "total_count": 56
}

List of editorial livefeeds

Properties

Name Type Description
data
(Required)
[EditorialLivefeed]

Editorial livefeeds

total_count
(Required)
integer

Total count of all results

message string

Optional error message

page integer

Current page of the response

per_page integer

Number of results per page

EditorialSearchResults

Example

{
  "per_page": 1,
  "total_count": 46845,
  "search_id": "BaMzOAkpHIvfnuWVRFs1ag",
  "next": "eyJ2IjoyLCJzIjoxLCJwIjpbMF19",
  "prev": "",
  "data": [
    {
      "id": "10687730b",
      "title": "Soccer Premier League, Manchester, United Kingdom - 11 May 2021",
      "caption": "",
      "description": "Security and stewards stand outside the Old Trafford stadium in Manchester, England, ahead of the English Premier League soccer match between Manchester United and Leicester City. This is the first Manchester United home match since fans protested against American owner Joel Glazer, forcing the postponement of the team's Premier League game against Liverpool. The protests prompted Glazer to publish a letter in which he pledged to accelerate discussions with fans about supporters being able to have a greater say at the club",
      "byline": "Jon Super/AP/Shutterstock",
      "keywords": [
        "england",
        "europe",
        "leicester city fc",
        "manchester",
        "manchester united fc",
        "men's soccer",
        "men's sports",
        "premier league",
        "professional soccer",
        "soccer",
        "sports",
        "united kingdom",
        "western europe",
        "wsoc"
      ],
      "date_taken": "2021-05-11",
      "categories": [
        {
          "name": "Sport"
        }
      ],
      "aspect": 1.621,
      "assets": {
        "thumb_170": {
          "height": 105,
          "width": 170,
          "url": "https://editorial01.qa.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
        },
        "thumb_220": {
          "height": 136,
          "width": 220,
          "url": "https://editorial01.qa.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
        },
        "watermark_450": {
          "height": 278,
          "width": 450,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
        },
        "watermark_1500": {
          "height": 926,
          "width": 1500,
          "url": "https://editorial01.qa.shuttercorp.net/wm-preview-1500/10687730b/ee2d7ae1/Shutterstock_10687730b.jpg"
        },
        "small_jpg": {
          "display_name": "Small",
          "width": 500,
          "height": 309,
          "is_licensable": true
        },
        "medium_jpg": {
          "display_name": "Med",
          "width": 1000,
          "height": 617,
          "is_licensable": true
        },
        "original": {
          "display_name": "Original",
          "height": 3693,
          "width": 5985,
          "is_licensable": true
        }
      }
    }
  ]
}

Editorial search results

Properties

Name Type Description
data
(Required)
[EditorialContent]

Editorial items

total_count
(Required)
integer

Total count of all results

message string

Optional error message

next string

Cursor value that represents the next page of results

page integer

Current page of the response

per_page integer

Number of results per page

prev string

Cursor value that represents the previous page of results

search_id string

Unique identifier for the search request

EditorialUpdatedContent

Example

{
  "id": "9804979n",
  "title": "Hong Kong kicks off international e-Sports competition, China - 24 Aug 2018",
  "caption": "",
  "description": "Members of the TyLoo e-Sports team from China prepare to face off against the Kinguin e-Sports team from Poland at the ICBC (Asia) e-Sports and Music Festival Hong Kong 2018, Hong Kong, China, 24 August 2018. The festival runs from 24 to 26 August with professional gamers from around the world competing in international e-sports tournaments.",
  "byline": "ALEX HOFFORD/EPA-EFE/Shutterstock",
  "supplier_code": "EPA",
  "keywords": [],
  "date_taken": "2018-08-24",
  "categories": [],
  "aspect": 1.481,
  "assets": {
    "thumb_170": {
      "height": 115,
      "width": 170,
      "url": "https://editorial01.shutterstock.com/thumb/9804979n/c4377a53/Shutterstock_9804979n.jpg"
    },
    "thumb_220": {
      "height": 149,
      "width": 220,
      "url": "https://editorial01.shutterstock.com/thumb-220/9804979n/c57a68c7/Shutterstock_9804979n.jpg"
    },
    "watermark_450": {
      "height": 304,
      "width": 450,
      "url": "https://editorial01.shutterstock.com/wm-preview-450/9804979n/37d19dce/Shutterstock_9804979n.jpg"
    },
    "watermark_1500": {
      "height": 1500,
      "width": 1040,
      "url": "https://editorial01.shutterstock.com/wm-preview-1500/9933285a/ab82fea4/Shutterstock_9933285a.jpg"
    },
    "original": {
      "display_name": "Original",
      "height": 3263,
      "width": 4831,
      "is_licensable": true
    },
    "small_jpg": {
      "display_name": "Small",
      "height": 337,
      "width": 500,
      "is_licensable": true
    },
    "medium_jpg": {
      "display_name": "Med",
      "height": 675,
      "width": 1000,
      "is_licensable": true
    }
  },
  "updated_time": "2019-07-15T20:04:44-04:00",
  "updates": [
    "addition"
  ],
  "commercial_status": {
    "status": "available"
  },
  "rights": {
    "countries": "CAN,+DEU,+GBR,+USA,-*"
  }
}

Metadata about updated editorial content

Properties

Name Type Description
id
(Required)
string

aspect number

assets EditorialAssets

Asset information, including size and thumbnail URLs

byline string

caption string

categories [EditorialCategory]

List of categories

commercial_status

created_time string

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

date_taken string

Format: YYYY-MM-DD
Example: 2020-05-29

description string

keywords [string]

rights object

special_instructions string

supplier_code string

title string

updated_time string

Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

updates [string]

EditorialUpdatedResults

Example

{
  "per_page": 1,
  "next": "eyJ2IjoxLCJzIjoxfQ==",
  "prev": "",
  "data": [
    {
      "id": "9804979n",
      "title": "Hong Kong kicks off international e-Sports competition, China - 24 Aug 2018",
      "caption": "",
      "description": "Members of the TyLoo e-Sports team from China prepare to face off against the Kinguin e-Sports team from Poland at the ICBC (Asia) e-Sports and Music Festival Hong Kong 2018, Hong Kong, China, 24 August 2018. The festival runs from 24 to 26 August with professional gamers from around the world competing in international e-sports tournaments.",
      "byline": "ALEX HOFFORD/EPA-EFE/Shutterstock",
      "supplier_code": "EPA",
      "keywords": [],
      "date_taken": "2018-08-24",
      "categories": [],
      "aspect": 1.481,
      "assets": {
        "thumb_170": {
          "height": 115,
          "width": 170,
          "url": "https://editorial01.shutterstock.com/thumb/9804979n/c4377a53/Shutterstock_9804979n.jpg"
        },
        "thumb_220": {
          "height": 149,
          "width": 220,
          "url": "https://editorial01.shutterstock.com/thumb-220/9804979n/c57a68c7/Shutterstock_9804979n.jpg"
        },
        "watermark_450": {
          "height": 304,
          "width": 450,
          "url": "https://editorial01.shutterstock.com/wm-preview-450/9804979n/37d19dce/Shutterstock_9804979n.jpg"
        },
        "watermark_1500": {
          "height": 1500,
          "width": 1040,
          "url": "https://editorial01.shutterstock.com/wm-preview-1500/9933285a/ab82fea4/Shutterstock_9933285a.jpg"
        },
        "original": {
          "display_name": "Original",
          "height": 3263,
          "width": 4831,
          "is_licensable": true
        },
        "small_jpg": {
          "display_name": "Small",
          "height": 337,
          "width": 500,
          "is_licensable": true
        },
        "medium_jpg": {
          "display_name": "Med",
          "height": 675,
          "width": 1000,
          "is_licensable": true
        }
      },
      "updated_time": "2019-07-15T20:04:44-04:00",
      "updates": [
        "addition"
      ],
      "commercial_status": {
        "status": "available"
      },
      "rights": {
        "countries": "CAN,+DEU,+GBR,+USA,-*"
      }
    }
  ]
}

Editorial updated results

Properties

Name Type Description
data
(Required)
[EditorialUpdatedContent]

Editorial updated items

message string

Optional error message

next string

Cursor value that represents the next page of results

per_page integer

Number of results per page

prev string

Cursor value that represents the previous page of results

EditorialVideoAssets

Example

{
  "preview_mp4": {
    "url": "https://qa.editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
  },
  "preview_webm": {
    "url": "https://qa.editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
  },
  "thumb_jpg": {
    "url": "https://qa.editorial-cdn.shuttercorp.net/thumb-1/10679854a/M5TcAf30Ncjcge2eMTI4NjY=/Shutterstock_10679854a.jpg"
  },
  "original": {
    "height": 1080,
    "width": 1080,
    "fps": 30,
    "format": "avc1",
    "file_size": 82233387,
    "display_name": "HD",
    "is_licensable": true
  }
}

Asset information, including size and thumbnail URLs

Properties

Name Type Description
original VideoSizeDetails

Video asset information

preview_mp4 VideoPreviewUrl

Video preview information

preview_webm VideoPreviewUrl

Video preview information

thumb_jpg VideoPreviewUrl

Video preview information

EditorialVideoCategoryResults

Example

{
  "data": [
    {
      "name": "Animal"
    },
    {
      "name": "Awards"
    },
    {
      "name": "Art"
    },
    {
      "name": "Film Stills"
    }
  ]
}

List of editorial video categories

Properties

Name Type Description
data [EditorialCategory]

Name of an editorial category

EditorialVideoContent

Example

{
  "id": "10679854a",
  "title": "Peeps the Goose Has a Blast on a Jet Ski, Prior Lake, Minnesota, USA - 13 Nov 2020",
  "caption": "",
  "description": "Info from Licensor: \"Peeps the Canadian Goose has been raised with our family since a gosling. Peeps has made appearances on our local news channels, TV shows, and local newspapers. He has been trained to fly next to four wheelers, jet ski's, and boats. He has brought joy to many people during the pandemic including those with cancer.\"",
  "byline": "ViralHog/Shutterstock",
  "keywords": [
    "2020",
    "adorable",
    "birds",
    "bizarre",
    "canadian goose",
    "cute",
    "domesticated animals",
    "entertainment",
    "feel good",
    "flew",
    "flies",
    "fly",
    "flying",
    "fun",
    "goose",
    "jet skis",
    "nature",
    "odd",
    "pets",
    "played",
    "playing",
    "plays",
    "prior lake",
    "sports",
    "strange",
    "sweet",
    "usa",
    "viralhog",
    "virals",
    "water sports",
    "weird"
  ],
  "date_taken": "2020-11-13",
  "categories": [],
  "aspect": 1,
  "assets": {
    "preview_mp4": {
      "url": "https://qa.editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
    },
    "preview_webm": {
      "url": "https://qa.editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
    },
    "thumb_jpg": {
      "url": "https://qa.editorial-cdn.shuttercorp.net/thumb-1/10679854a/M5TcAf30Ncjcge2eMTI4NjY=/Shutterstock_10679854a.jpg"
    },
    "original": {
      "height": 1080,
      "width": 1080,
      "fps": 30,
      "format": "avc1",
      "file_size": 82233387,
      "display_name": "HD",
      "is_licensable": true
    }
  }
}

Metadata about editorial content

Properties

Name Type Description
id
(Required)
string

aspect number

assets EditorialVideoAssets

Asset information, including size and thumbnail URLs

byline string

caption string

categories [EditorialCategory]

List of categories

date_taken string

Format: YYYY-MM-DD
Example: 2020-05-29

description string

keywords [string]

title string

EditorialVideoSearchResults

Example

{
  "data": [
    {
      "id": "10679854a",
      "title": "Peeps the Goose Has a Blast on a Jet Ski, Prior Lake, Minnesota, USA - 13 Nov 2020",
      "caption": "",
      "description": "Info from Licensor: \"Peeps the Canadian Goose has been raised with our family since a gosling. Peeps has made appearances on our local news channels, TV shows, and local newspapers. He has been trained to fly next to four wheelers, jet ski's, and boats. He has brought joy to many people during the pandemic including those with cancer.\"",
      "byline": "ViralHog/Shutterstock",
      "keywords": [
        "2020",
        "adorable",
        "birds",
        "bizarre",
        "canadian goose",
        "cute",
        "domesticated animals",
        "entertainment",
        "feel good",
        "flew",
        "flies",
        "fly",
        "flying",
        "fun",
        "goose",
        "jet skis",
        "nature",
        "odd",
        "pets",
        "played",
        "playing",
        "plays",
        "prior lake",
        "sports",
        "strange",
        "sweet",
        "usa",
        "viralhog",
        "virals",
        "water sports",
        "weird"
      ],
      "date_taken": "2020-11-13",
      "categories": [],
      "aspect": 1,
      "assets": {
        "preview_mp4": {
          "url": "https://qa.editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
        },
        "preview_webm": {
          "url": "https://qa.editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
        },
        "thumb_jpg": {
          "url": "https://qa.editorial-cdn.shuttercorp.net/thumb-1/10679854a/M5TcAf30Ncjcge2eMTI4NjY=/Shutterstock_10679854a.jpg"
        },
        "original": {
          "height": 1080,
          "width": 1080,
          "fps": 30,
          "format": "avc1",
          "file_size": 82233387,
          "display_name": "HD",
          "is_licensable": true
        }
      }
    }
  ],
  "per_page": 1,
  "total_count": 331,
  "search_id": "zhmz9zLmpQehdTPvg8cacQ",
  "next": "eyJ2IjoyLCJzIjoyMCwicCI6WzBdfQ==",
  "prev": ""
}

Editorial search results

Properties

Name Type Description
data
(Required)
[EditorialVideoContent]

Editorial items

total_count
(Required)
integer

Total count of all results

message string

Optional error message

next string

Cursor value that represents the next page of results

page integer

Current page of the response

per_page integer

Number of results per page

prev string

Cursor value that represents the previous page of results

search_id string

Unique identifier for the search request

Error

Example

{
  "code": "VALIDATION_INVALID_TYPE",
  "data": "'10'",
  "message": "Invalid type: string should be integer",
  "path": "$.query.page"
}

Error object

Properties

Name Type Description
message
(Required)
string

Specific details about this error

code string

The error code of this error

data string

Debugging information about the error

items [object]

A list of items that produced the error

path string

Internal code reference to the source of the error

Example

{
  "total_item_count": 82,
  "items_updated_time": "2021-07-08T12:33:37.000Z",
  "name": "Exercise & Fitness",
  "id": "19853",
  "created_time": "2021-07-07T13:10:24.000Z",
  "updated_time": "2021-07-07T13:10:24.000Z",
  "cover_item": {
    "url": "https://ak.picdn.net/assets/cms/b467415246debdab45825d915a548f8f79b57882-Collection_1_Thumnail.jpg"
  }
}

Metadata about a featured collection

Properties

Name Type Description
id
(Required)
string

Collection ID

name
(Required)
string

Name of the collection

total_item_count
(Required)
integer

Total number of items in the collection

cover_item FeaturedCollectionCoverItem

Featured collection cover item metadata

created_time string

Date that the collection was created Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

hero_item FeaturedCollectionCoverItem

Top-level item that is meant as a cover asset, as the first asset seen to represent the collection

items_updated_time string

Date that an item in the collection was last added or removed Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

share_url string

Unique share url for the collection

updated_time string

Date that the collection was last modified Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

Example

{
  "url": "https://ak.picdn.net/assets/cms/b467415246debdab45825d915a548f8f79b57882-Collection_1_Thumnail.jpg"
}

Featured collection cover item metadata

Properties

Name Type Description
url
(Required)
string

URL of the collection cover item

Example

{
  "data": [
    {
      "total_item_count": 82,
      "items_updated_time": "2021-07-08T12:33:37.000Z",
      "name": "Exercise & Fitness",
      "id": "19853",
      "created_time": "2021-07-07T13:10:24.000Z",
      "updated_time": "2021-07-07T13:10:24.000Z",
      "cover_item": {
        "url": "https://ak.picdn.net/assets/cms/b467415246debdab45825d915a548f8f79b57882-Collection_1_Thumnail.jpg"
      }
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

List of featured collections

Properties

Name Type Description
data [FeaturedCollection]

Featured collections

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

total_count integer

Total count of all results across all pages

GenreList

Example

{
  "data": [
    "Rock",
    "Pop > Singer-Songwriter",
    "Pop > Synth Pop",
    "Production / Film Scores"
  ]
}

List of audio genres

Properties

Name Type Description
data
(Required)
[string]

List of genres

ISOCountryCode

Example

"USA"

A valid ISO 3166-1 Alpha-2 or ISO 3166-1 Alpha-3 code.

Image

Example

{
  "id": "1572478477",
  "aspect": 1.5,
  "assets": {
    "preview": {
      "height": 300,
      "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
      "width": 450
    },
    "small_thumb": {
      "height": 67,
      "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
      "width": 100
    },
    "large_thumb": {
      "height": 100,
      "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
      "width": 150
    },
    "mosaic": {
      "height": 167,
      "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-250nw-1572478477.jpg",
      "width": 250
    },
    "huge_thumb": {
      "height": 260,
      "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
      "width": 390
    },
    "preview_1000": {
      "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
      "width": 1000,
      "height": 667
    },
    "preview_1500": {
      "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
      "width": 1500,
      "height": 1000
    }
  },
  "contributor": {
    "id": "250738318"
  },
  "description": "cropped image of woman gardening",
  "image_type": "photo",
  "has_model_release": true,
  "media_type": "image",
  "original_filename": "123.jpg"
}

Information about an image

Properties

Name Type Description
contributor
(Required)
Contributor

Information about a contributor

id
(Required)
string

Image ID

media_type
(Required)
string

Media type of this image, should always be "image"

added_date string

Date that the image was added by the contributor Format: YYYY-MM-DD
Example: 2020-05-29

affiliate_url string

Affiliate referral link; appears only for registered affiliate partners Format: A valid URI
Example: https://wwww.shutterstock.com

aspect number

Aspect ratio of the image in decimal format, such as 0.6667

assets ImageAssets

Image asset information

categories [Category]

Categories that this image is a part of

description string

Detailed description of the image

has_model_release boolean

Indicates whether there are model releases for the image

has_property_release boolean

Indicates whether there are property releases for the image

image_type string

Type of image

insights object

AI-powered insights about how the asset will perform for the objective and audience

is_adult boolean

Whether or not this image contains adult content

is_editorial boolean

Whether or not this image is editorial content

is_illustration boolean

Whether or not this image is an illustration

keywords [string]

Keywords associated with the content of this image

model_releases [ModelRelease]

List of model releases

models [Model]

List of models

releases [string]

List of all releases of this image

url string

Link to image information page; included only for certain accounts

ImageAssets

Example

{
  "preview": {
    "height": 300,
    "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
    "width": 450
  },
  "small_thumb": {
    "height": 67,
    "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
    "width": 100
  },
  "large_thumb": {
    "height": 100,
    "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
    "width": 150
  },
  "mosaic": {
    "height": 167,
    "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-250nw-1572478477.jpg",
    "width": 250
  },
  "huge_thumb": {
    "height": 260,
    "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
    "width": 390
  },
  "preview_1000": {
    "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
    "width": 1000,
    "height": 667
  },
  "preview_1500": {
    "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
    "width": 1500,
    "height": 1000
  }
}

Information about the assets that are part of an image

Properties

Name Type Description
huge_jpg ImageSizeDetails

Image size information

huge_thumb Thumbnail

Image thumbnail information

large_thumb Thumbnail

Image thumbnail information

medium_jpg ImageSizeDetails

Image size information

mosaic Thumbnail

Image thumbnail information

preview Thumbnail

Image thumbnail information

preview_1000 Thumbnail

Image thumbnail information

preview_1500 Thumbnail

Image thumbnail information

small_jpg ImageSizeDetails

Image size information

small_thumb Thumbnail

Image thumbnail information

supersize_jpg ImageSizeDetails

Image size information

vector_eps ImageSizeDetails

Image size information

ImageCreateRequest

Example

{
  "base64_image": "R0lGODlhgACAAPcAAEwiBLyaLOzNUNmWFNjOrNSuN7x6PPzqeOTMgfKSDMyuTPzwsdi2dHwuBPzbVu"
}

Request to upload an image

Properties

Name Type Description
base64_image
(Required)
string

A Base 64 encoded jpeg or png; images can be no larger than 10mb and can be no larger than 10,000 pixels in width or height

ImageCreateResponse

Example

{
  "id": "Udb14e1c3540bdbf82b4b3fe12d3a44f2"
}

Image upload information

Properties

Name Type Description
id
(Required)
string

ImageDataList

Example

{
  "data": [
    {
      "id": "1572478477",
      "aspect": 1.5,
      "assets": {
        "preview": {
          "height": 300,
          "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 450
        },
        "small_thumb": {
          "height": 67,
          "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 100
        },
        "large_thumb": {
          "height": 100,
          "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 150
        },
        "mosaic": {
          "height": 167,
          "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-250nw-1572478477.jpg",
          "width": 250
        },
        "huge_thumb": {
          "height": 260,
          "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
          "width": 390
        },
        "preview_1000": {
          "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
          "width": 1000,
          "height": 667
        },
        "preview_1500": {
          "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 1500,
          "height": 1000
        }
      },
      "contributor": {
        "id": "250738318"
      },
      "description": "cropped image of woman gardening",
      "image_type": "photo",
      "has_model_release": true,
      "media_type": "image"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

List of images

Properties

Name Type Description
data [Image]

Images

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

total_count integer

Total count of all results across all pages

ImageSearchResults

Example

{
  "data": [
    {
      "id": "1572478477",
      "aspect": 1.5,
      "assets": {
        "preview": {
          "height": 300,
          "url": "https://image.shutterstock.com/display_pic_with_logo/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 450
        },
        "small_thumb": {
          "height": 67,
          "url": "https://thumb7.shutterstock.com/thumb_small/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 100
        },
        "large_thumb": {
          "height": 100,
          "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 150
        },
        "mosaic": {
          "height": 167,
          "url": "https://image.shutterstock.com/image-photo/stock-photo-cropped-image-of-woman-gardening-250nw-1572478477.jpg",
          "width": 250
        },
        "huge_thumb": {
          "height": 260,
          "url": "https://image.shutterstock.com/image-photo/cropped-image-woman-gardening-260nw-1572478477.jpg",
          "width": 390
        },
        "preview_1000": {
          "url": "https://ak.picdn.net/shutterstock/photos/1572478477/watermark_1000/1706028c641ea2f443057287c67d9b91/preview_1000-1572478477.jpg",
          "width": 1000,
          "height": 667
        },
        "preview_1500": {
          "url": "https://image.shutterstock.com/z/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
          "width": 1500,
          "height": 1000
        }
      },
      "contributor": {
        "id": "250738318"
      },
      "description": "cropped image of woman gardening",
      "image_type": "photo",
      "has_model_release": true,
      "media_type": "image"
    }
  ],
  "page": 1,
  "per_page": 5,
  "search_id": "749090bb-2967-4a20-b22e-c800dc845e10",
  "spellcheck_info": {},
  "total_count": 45
}

Image search results

Properties

Name Type Description
data
(Required)
[Image]

List of images

search_id
(Required)
string

Unique identifier for the search request

total_count
(Required)
integer

Total count of all results across all pages

insights Insights

AI-powered insights about an asset, based on the specified audience and objective

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

spellcheck_info object

Returns information if search phrase has potentially been mistyped or another query would lead to better search results

ImageSizeDetails

Example

{
  "display_name": "Med",
  "dpi": 300,
  "file_size": 860200,
  "format": "jpg",
  "height": 667,
  "is_licensable": true,
  "width": 1000
}

Image size information

Properties

Name Type Description
display_name string

Display name of this image size

dpi integer

file_size integer

File size (in bytes) of this image size

format string

Format of this image size

height integer

Height of this image size

is_licensable boolean

Whether or not this image can be licensed in this image size

width integer

Width of this image size

Insights

Example

{
  "label_performance": [
    {
      "name": "Nature",
      "percentile_performance": 98.82123565673828
    },
    {
      "name": "Outdoors",
      "percentile_performance": 98.63294982910156
    }
  ]
}

AI-powered insights about an asset, based on the specified audience and objective

Properties

Name Type Description
label_performance
(Required)
[object]

How effective the AI thinks an asset in the category is for the specified audience and objective, expressed as a percentile compared to other images

InstrumentList

Example

{
  "data": [
    "Orchestra",
    "Organ",
    "Oud",
    "Pads",
    "Electric Guitar"
  ]
}

List of instruments

Properties

Name Type Description
data
(Required)
[string]

List of instruments

KeywordDataList

Example

{
  "data": [
    "nature",
    "wildlife",
    "animal",
    "cute",
    "bamboo",
    "panda",
    "china",
    "wild",
    "endangered",
    "black",
    "bear"
  ]
}

List of keywords

Properties

Name Type Description
data [string]

Keywords

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

Language

Example

"cs"

Language code

Valid values

LicenseAudio

Example

{
  "audio_id": "123456789",
  "license": "audio_platform",
  "search_id": "987654321"
}

An audio track in a licensing request

Properties

Name Type Description
audio_id
(Required)
string

ID of the track being licensed

license string

Type of license

Valid values: audio_platform, premier_music_basic, premier_music_extended, premier_music_pro, premier_music_comp, asset_all_music

search_id string

ID of the search that led to this licensing event

LicenseAudioRequest

Example

{
  "audio": [
    {
      "audio_id": "591623",
      "license": "audio_platform",
      "metadata": {
        "customer_id": "12345"
      }
    }
  ]
}

Audio license request data

Properties

Name Type Description
audio
(Required)
[LicenseAudio]

List of audio tracks to license

Maximum length: 50

LicenseAudioResult

Example

{
  "audio_id": "123456789",
  "download": {
    "url": "http://download2.dev.shutterstock.com/gatekeeper/abc/original.wav"
  },
  "license_id": "abcdef123456789ghijklmn",
  "allotment_charge": 1
}

The response to a licensing request for an audio track

Properties

Name Type Description
audio_id
(Required)
string

ID of the track that was licensed

allotment_charge number

Number of credits that this licensing event used

download AudioUrl

Audio License URL object

error string

Error information if applicable

license_id string

ID of the license event

LicenseAudioResultDataList

Example

{
  "data": [
    {
      "audio_id": "123456789",
      "download": {
        "url": "http://download2.dev.shutterstock.com/gatekeeper/abc/original.wav"
      },
      "license_id": "abcdef123456789ghijklmn",
      "allotment_charge": 1
    }
  ]
}

List of audio license results

Properties

Name Type Description
data [LicenseAudioResult]

License results

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

total_count integer

Total count of all results across all pages

LicenseEditorialContent

Example

{
  "editorial_id": "10687730b",
  "license": "premier_editorial_comp",
  "metadata": {
    "customer_id": "12345",
    "geo_location": "US",
    "number_viewed": "15",
    "search_term": "dog"
  },
  "size": "original"
}

Individual editorial content to license

Properties

Name Type Description
editorial_id
(Required)
string

Editorial ID

license
(Required)
string

License agreement to use for licensing

metadata LicenseRequestMetadata

Additional information for license requests for enterprise accounts and API subscriptions, 4 fields maximum; which fields are required is set by the account holder

size string

Asset size to download

Default: original

Valid values: small, medium, original

LicenseEditorialContentRequest

Example

{
  "country": "USA",
  "editorial": [
    {
      "editorial_id": "10687730b",
      "license": "premier_editorial_comp",
      "metadata": {
        "customer_id": "12345",
        "geo_location": "US",
        "number_viewed": "15",
        "search_term": "dog"
      },
      "size": "original"
    }
  ]
}

License editorial content request

Properties

Name Type Description
country
(Required)
ISOCountryCode

Mandatory country code for where the editorial content will be distributed; this value is used for rights checks

editorial
(Required)
[LicenseEditorialContent]

Editorial content to license

LicenseEditorialContentResult

Example

{
  "allotment_charge": 1,
  "editorial_id": "69656358",
  "download": {
    "url": "https://s3-eu-west-1.amazonaws.com/api-downloads.rexfeatures.com/[random-characters].jpg?Expires=1524717323"
  }
}

The response to a licensing request for editorial content

Properties

Name Type Description
editorial_id
(Required)
string

Editorial ID

allotment_charge integer

For pre-paid plans, how many credits were used for the item license

download Url

Information that is needed to download the image

error string

LicenseEditorialContentResults

Example

{
  "data": [
    {
      "allotment_charge": 1,
      "editorial_id": "69656358",
      "download": {
        "url": "https://s3-eu-west-1.amazonaws.com/api-downloads.rexfeatures.com/[random-characters].jpg?Expires=1524717323"
      }
    }
  ],
  "page": 1,
  "per_page": 1,
  "total_count": 12
}

List of editorial license results

Properties

Name Type Description
data [LicenseEditorialContentResult]

License results

errors [Error]

Error list; appears only if there was an error

message string

Optional error message

page integer

Current page of the response

per_page integer

Number of results per page

total_count integer

Total count of all results

LicenseEditorialVideoContent

Example

{
  "editorial_id": "10679854a",
  "license": "premier_editorial_video_digital_only",
  "metadata": {
    "purchase_order": "12345"
  },
  "size": "original"
}

Individual editorial video content to license

Properties

Name Type Description
editorial_id
(Required)
string

Editorial ID

license
(Required)
string

License agreement to use for licensing

Valid values: premier_editorial_video_digital_only, premier_editorial_video_all_media, premier_editorial_video_all_media_single_territory, premier_editorial_video_comp

metadata LicenseRequestMetadata

Additional information for license requests for enterprise accounts and API subscriptions, 4 fields maximum; which fields are required is set by the account holder

size string

Asset size to download

Default: original

Valid values: original

LicenseEditorialVideoContentRequest

Example

{
  "country": "USA",
  "editorial": [
    {
      "editorial_id": "10679854a",
      "license": "premier_editorial_video_digital_only",
      "metadata": {
        "purchase_order": "12345"
      },
      "size": "original"
    }
  ]
}

License editorial video content request

Properties

Name Type Description
country
(Required)
ISOCountryCode

Mandatory country code for where the editorial content will be distributed; this value is used for rights checks

editorial
(Required)
[LicenseEditorialVideoContent]

Editorial content to license

LicenseFormat

Example

{
  "media_type": "image",
  "description": "Med",
  "format": "jpg",
  "min_resolution": 1000,
  "size": "medium"
}

Description of a license

Properties

Name Type Description
description string

Description of the license

format string

Format or extension of the media, such as mpeg for videos or jpeg for images

media_type string

Media type of the license

Valid values: image, video, audio, editorial

min_resolution integer

Width of the media, in pixels, allowed by this license

size string

Keyword that details the size of the media, such as hd or sd for video, huge or vector for images

LicenseImage

Example

{
  "editorial_acknowledgement": true,
  "format": "jpg",
  "image_id": "123456789",
  "metadata": {
    "customer_id": "12345",
    "geo_location": "US",
    "number_viewed": "15",
    "search_term": "dog"
  },
  "price": 12.34,
  "show_modal": true,
  "size": "small",
  "subscription_id": "s12345678"
}

Data required to license an image

Properties

Name Type Description
image_id
(Required)
string

Image ID

auth_cookie Cookie

Cookie object

custom_dimensions CustomSizeDimensions

A custom height or a custom width to resize the image to, but not both (experimental)

editorial_acknowledgement boolean

Set to true to acknowledge the editorial agreement

format string

(Deprecated) Image format to download

Default: jpg

Valid values: jpg

metadata LicenseRequestMetadata

Additional information for license requests for enterprise accounts and API subscriptions, 4 fields maximum; which fields are required is set by the account holder

price number

For revenue-sharing transactions, the final cost to the end customer as a floating-point number in the transaction currency, such as 12.34

search_id string

ID of the search that led to this licensing transaction

size string

Image size to download

Valid values: small, medium, huge, custom

subscription_id string

ID of the subscription to use for the download.

show_modal boolean

(Deprecated)

verification_code string

(Deprecated)

LicenseImageRequest

Example

{
  "images": [
    {
      "editorial_acknowledgement": true,
      "format": "jpg",
      "image_id": "123456789",
      "metadata": {
        "customer_id": "12345",
        "geo_location": "US",
        "number_viewed": "15",
        "search_term": "dog"
      },
      "price": 12.34,
      "show_modal": true,
      "size": "small",
      "subscription_id": "s12345678"
    }
  ]
}

Image license request data

Properties

Name Type Description
images
(Required)
[LicenseImage] or [LicenseImageVector]

Images to create licenses for

Maximum length: 50

LicenseImageResult

Example

{
  "image_id": "59656357",
  "download": {
    "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.jpg"
  },
  "allotment_charge": 1,
  "price": {
    "local_amount": 12.34,
    "local_currency": "EUR"
  }
}

The response to a licensing request for an image

Properties

Name Type Description
image_id
(Required)
string

Image ID that was licensed

allotment_charge integer

Number of credits that this licensing event used

download Url

Information that is needed to download the image

error string

Error message, appears only if there was an error

license_id string

ID of the license event

price Price

Wholesale price information; only for rev-share partners

LicenseImageResultDataList

Example

{
  "data": [
    {
      "image_id": "59656357",
      "download": {
        "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.jpg"
      },
      "allotment_charge": 1
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 23
}

List of information about licensed images

Properties

Name Type Description
data [LicenseImageResult]

License results

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

total_count integer

Total count of all results across all pages

LicenseImageVector

Example

{
  "editorial_acknowledgement": true,
  "format": "eps",
  "image_id": "123456789",
  "metadata": {
    "customer_id": "12345",
    "geo_location": "US",
    "number_viewed": "15",
    "search_term": "dog"
  },
  "price": 12.34,
  "show_modal": true,
  "size": "vector",
  "subscription_id": "s12345678"
}

Data required to license an image

Properties

Name Type Description
image_id
(Required)
string

Image ID

auth_cookie Cookie

Cookie object

editorial_acknowledgement boolean

Set to true to acknowledge the editorial agreement

format string

(Deprecated) Image format to download

Default: eps

Valid values: eps

metadata LicenseRequestMetadata

Additional information for license requests for enterprise accounts and API subscriptions, 4 fields maximum; which fields are required is set by the account holder

price number

For revenue-sharing transactions, the final cost to the end customer as a floating-point number in the transaction currency, such as 12.34

search_id string

ID of the search that led to this licensing transaction

size string

Image size to download

Valid values: vector

subscription_id string

ID of the subscription to use for the download.

show_modal boolean

(Deprecated)

verification_code string

(Deprecated)

LicenseRequestMetadata

Example

{
  "customer_id": "12345",
  "geo_location": "US",
  "number_viewed": "15",
  "search_term": "dog"
}

Additional information for license requests for enterprise accounts and API subscriptions, 4 fields maximum; which fields are required is set by the account holder

Properties

None.

LicenseSFX

Example

{
  "format": "wav",
  "sfx_id": "123456789",
  "metadata": {
    "customer_id": "12345",
    "geo_location": "US",
    "number_viewed": "15",
    "search_term": "dog"
  },
  "show_modal": true,
  "size": "ambisonic",
  "subscription_id": "s12345678"
}

Properties

Name Type Description
sfx_id
(Required)
string

ID of the sounds effect being licensed

subscription_id
(Required)
string

ID of the subscription to use for the download.

audio_layout string

Valid values: ambisonic, 5.1, stereo

format string

Valid values: wav, mp3

search_id string

ID of the search that led to this licensing event

LicenseSFXRequest

Example

{
  "sound_effects": [
    {
      "format": "wav",
      "sfx_id": "123456789",
      "metadata": {
        "customer_id": "12345",
        "geo_location": "US",
        "number_viewed": "15",
        "search_term": "dog"
      },
      "show_modal": true,
      "size": "ambisonic",
      "subscription_id": "s12345678"
    }
  ]
}

License sounds effect asset request body

Properties

Name Type Description
sound_effects
(Required)
[LicenseSFX]

Sound effects to license for

LicenseSFXResult

Example

{
  "sfx_id": "59656357",
  "download": {
    "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.wav"
  },
  "allotment_charge": 1
}

The response to a licensing request for an sound effects

Properties

Name Type Description
sfx_id
(Required)
string

Sound effects ID that was licensed

allotment_charge integer

Number of credits that this licensing event used

download Url

Information that is needed to download the sound effects

error string

Error message, appears only if there was an error

license_id string

ID of the license event

LicenseSFXResultDataList

Example

{
  "data": [
    {
      "allotment_charge": 1,
      "download": {
        "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.mp3"
      },
      "sfx_id": "123456789"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

List of information about licensed sound effects

Properties

Name Type Description
data [LicenseSFXResult]

Sound effects license results

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

LicenseVideo

Example

{
  "size": "hd",
  "subscription_id": "s12345678",
  "video_id": "2140697"
}

Data required to license a video

Properties

Name Type Description
video_id
(Required)
string

ID of the video being licensed

auth_cookie Cookie

Cookie object

editorial_acknowledgement boolean

Whether or not this item is editorial content

metadata LicenseRequestMetadata

Additional information for license requests for enterprise accounts and API subscriptions, 4 fields maximum; which fields are required is set by the account holder

price number

Retail price amount as a floating-point number in the transaction currency, such as 12.34; only for rev-share partners

search_id string

ID of the search that led to this licensing event

size string

Size of the video being licensed

Valid values: web, sd, hd, 4k

subscription_id string

ID of the subscription used for this license

show_modal boolean

(Deprecated)

LicenseVideoRequest

Example

{
  "videos": [
    {
      "size": "hd",
      "subscription_id": "s12345678",
      "video_id": "2140697"
    }
  ]
}

List of videos to license

Properties

Name Type Description
videos
(Required)
[LicenseVideo]

Videos to license

Maximum length: 50

LicenseVideoResult

Example

{
  "allotment_charge": 1,
  "download": {
    "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.mp4"
  },
  "price": {
    "local_amount": 12.34,
    "local_currency": "EUR"
  },
  "video_id": "123456789"
}

The response to a licensing request for a video

Properties

Name Type Description
video_id
(Required)
string

ID of the video that was licensed

allotment_charge integer

Number of credits that this licensing event used

download Url

URL object

error string

Potential error that occurred during licensing

license_id string

ID of the license event

price Price

Wholesale price information; only for rev-share partners only

LicenseVideoResultDataList

Example

{
  "data": [
    {
      "allotment_charge": 1,
      "download": {
        "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.mp4"
      },
      "price": {
        "local_amount": 12.34,
        "local_currency": "EUR"
      },
      "video_id": "123456789"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

List of video license results

Properties

Name Type Description
data [LicenseVideoResult]

License results

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

total_count integer

Total count of all results across all pages

Model

Example

{
  "id": "123456789"
}

Information about a human model or property that appears in media; used to search for assets that this model is in

Properties

Name Type Description
id
(Required)
string

ID of the model

ModelRelease

Example

{
  "id": "123456789"
}

Model and property release metadata

Properties

Name Type Description
id string

ID of the model or property release

MoodList

Example

{
  "data": [
    "Action / Sports",
    "Adventure / Discovery",
    "Aerobics / Workout",
    "Aggressive"
  ]
}

List of audio moods

Properties

Name Type Description
data
(Required)
[string]

List of audio moods

OauthAccessTokenResponse

Example

{
  "access_token": "v2/NmQwOTc0NTBiMjA5YzZkY2Q4NTkvMTA4OTg1MDk5L2N1c3RvbWVyLzIvZjB2a0RseGo4Rkt6ZjRmVWJNMm10V2VzcHh1NTBlZWJ6andUQU1NeTVYYnNFTDVWOFRJakItS2RnZTlmbEY1Y3haNWdXLUtYc2JhaXo5djk0V0p2QzZUUWZ4c2FNWm41NkdLYUgyVWlCaVUtQTNVMV9YQWpzd3lpblI3SlZEem8wSG1qQ2NzSkJlX3VQTnNXenBIdkd4SXViVi1rRGJTVENCV0g1U3U0RXRJSV9rSm5lQkl5QXlvbm5JN241UUhv",
  "token_type": "Bearer"
}

Access token response to client apps

Properties

Name Type Description
access_token
(Required)
string

Access token that can be used for future requests

token_type
(Required)
string

Type of token

Default: Bearer

expires_in integer

Number of seconds before token expires, only present for expiring tokens

refresh_token string

A refresh token that can be used to renew the access_token when it expires, only present for expiring tokens

user_token string

Metadata about the access_token, only present for expiring tokens

Price

Example

{
  "local_amount": 12.34,
  "local_currency": "EUR"
}

Price

Properties

Name Type Description
local_amount number

Floating-point amount of the calculated rev-share price in the currency local_currency

local_currency string

Currency of the rev-share price that was calculated

Recommendation

Example

{
  "id": "123456789"
}

Media Recommendation

Properties

Name Type Description
id
(Required)
string

Media ID

RecommendationDataList

Example

{
  "data": [
    {
      "id": "123456789"
    },
    {
      "id": "99379946"
    },
    {
      "id": "133918412"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 12
}

List of recommended images

Properties

Name Type Description
data [Recommendation]

Recommended images

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

total_count integer

Total count of all results across all pages

RedownloadImage

Example

{
  "size": "small"
}

Data required to redownload an image

Properties

Name Type Description
size string

Size of the image

Valid values: small, medium, huge, supersize, vector

auth_cookie Cookie

(Deprecated)

show_modal boolean

(Deprecated)

verification_code string

(Deprecated)

RedownloadVideo

Example

{
  "size": "web"
}

Data required to redownload a video

Properties

Name Type Description
size string

Size of the video

Valid values: web, sd, hd, 4k

auth_cookie Cookie

(Deprecated)

show_modal boolean

(Deprecated)

verification_code string

(Deprecated)

RemoveCatalogCollectionItem

Example

{
  "id": "123"
}

Properties

Name Type Description
id
(Required)
string

RemoveCatalogCollectionItems

Example

{
  "items": [
    {
      "id": "123"
    }
  ]
}

Properties

Name Type Description
items
(Required)
[RemoveCatalogCollectionItem]

Minimum length: 1

Maximum length: 50

SFX

Example

{
  "id": "123",
  "media_type": "sfx",
  "contributor": {
    "id": "1234"
  }
}

SFX metadata

Properties

Name Type Description
contributor
(Required)
Contributor

Information about a contributor

id
(Required)
string

Shutterstock ID of this sound effect

media_type
(Required)
string

Media type of this track; should always be "sfx"

added_date string

Date this sound effect was added to the Shutterstock library Format: YYYY-MM-DD
Example: 2020-05-29

affiliate_url string

Affiliate referral link; appears only for registered affiliate partners

artist string

Artist of the sound effect

assets SFXAssets

Files that are available as part of an sound effect asset

description string

Description of this sound effect

duration number

Duration of this sound effect in seconds

keywords [string]

List of all keywords for this sound effect

releases [string]

List of all releases of this sound effect

title string

Title of this sound effect

updated_time string

Time this sound effect was last updated Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

url string

SFXAssetDetails

Example

{
  "file_size": 123,
  "url": "https://cdn.shutterstock.com/shutterstock/sfx/11222/preview_ecom_ster/hand-throw-catch-cellphone.mp3"
}

Information about a file that is part of an sound effect asset

Properties

Name Type Description
file_size integer

File size of the sound effect

url string

URL the sound effect is available at

SFXAssets

Example

{
  "preview_mp3": {
    "file_size": 123,
    "url": "https://cdn.shutterstock.com/shutterstock/sfx/11222/preview_ecom_ster/hand-throw-catch-cellphone.mp3"
  },
  "waveform": {
    "file_size": 123,
    "url": "https://cdn.shutterstock.com/shutterstock/sfx/11222/preview_ecom_ster/hand-throw-catch-cellphone.mp3"
  }
}

Files that are available as part of an sound effect asset

Properties

Name Type Description
preview_mp3 SFXAssetDetails

Information about a file that is part of an sound effect asset

waveform SFXAssetDetails

Information about a file that is part of an sound effect asset

SFXDataList

Example

{
  "data": [
    {
      "id": "123",
      "media_type": "sfx",
      "contributor": {
        "id": "1234"
      }
    }
  ]
}

List of sound effects

Properties

Name Type Description
data [SFX]

Sound Effects

SFXSearchResults

Example

{
  "data": [
    {
      "id": "123",
      "description": "User interface calculations, scanning, thinking, text displayed on screen. Screen gak or garble.",
      "assets": {
        "preview_mp3": {
          "url": "https://cdn.shutterstock.com/shutterstock/sfx/21230/preview_ecom_ster/heavy-duty-interface-feedback.mp3"
        },
        "waveform": {
          "url": "https://cdn.shutterstock.com/shutterstock/sfx/21230/wvfm_img/heavy-duty-interface-feedback.png"
        }
      },
      "contributor": {
        "id": "321402911"
      },
      "title": "Heavy Duty Interface Feedback",
      "media_type": "sfx",
      "updated_time": "2022-08-04T15:11:15.711Z",
      "added_date": "2022-07-29"
    }
  ],
  "total_count": 14881,
  "search_id": "e6f84c4c-ffdd-499b-ad89-72c65a896ead"
}

Sound effects search results

Properties

Name Type Description
data
(Required)
[SFX]

List of tracks

search_id
(Required)
string

ID of the search

total_count
(Required)
integer

Total count of all results across all pages

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

SearchEntitiesRequest

Example

{
  "text": "Planting flowers is a great way to make springtime more beautiful."
}

Search entity request data

Properties

Name Type Description
text
(Required)
string

Plain text to extract keywords from

Minimum length: 1

Maximum length: 100000

SearchEntitiesResponse

Example

{
  "keywords": [
    "planting",
    "flowers",
    "springtime",
    "beautiful"
  ]
}

The response to a request for keyword analysis

Properties

Name Type Description
keywords [string]

The top keywords from the submitted text

SearchImage

Example

{
  "query": "cat",
  "license": [
    "editorial"
  ],
  "sort": "popular"
}

Data required to search for an image

Properties

Name Type Description
added_date string

Show images added on the specified date Format: YYYY-MM-DD
Example: 2020-05-29

added_date_end string

Show images added before the specified date Format: YYYY-MM-DD
Example: 2020-05-29

added_date_start string

Show images added on or after the specified date Format: YYYY-MM-DD
Example: 2020-05-29

aspect_ratio number

Show images with the specified aspect ratio, using a positive decimal of the width divided by the height, such as 1.7778 for a 16:9 image

aspect_ratio_max number

Show images with the specified aspect ratio or lower, using a positive decimal of the width divided by the height, such as 1.7778 for a 16:9 image

aspect_ratio_min number

Show images with the specified aspect ratio or higher, using a positive decimal of the width divided by the height, such as 1.7778 for a 16:9 image

authentic boolean

Show only authentic images

category string

Show images with the specified Shutterstock-defined category; specify a category name or ID

color string

Specify either a hexadecimal color in the format '4F21EA' or 'grayscale'; the API returns images that use similar colors

contributor [string]

Show images with the specified contributor names or IDs, allows multiple

contributor_country [string]

Show images from contributors in one or more specified countries, or start with NOT to exclude a country from the search

One of these formats:

  • Format: A two-character (ISO 3166 Alpha-2) country code
    Example: US
  • Format: A NOT followed by a two-character (ISO 3166 Alpha-2) country code
    Example: NOT US

fields string

Fields to display in the response; see the documentation for the fields parameter in the overview section

height integer

(Deprecated; use height_from and height_to instead) Show images with the specified height

height_from integer

Show images with the specified height or larger, in pixels

height_to integer

Show images with the specified height or smaller, in pixels

image_type [string]

Show images of the specified type

Valid values: photo, illustration, vector

keyword_safe_search boolean

Hide results with potentially unsafe keywords

Default: true

language Language

Set query and result language (uses Accept-Language header if not set)

license [string]

Show only images with the specified license

Default: commercial

Valid values: commercial, editorial, enhanced

model [string]

Show image results with the specified model IDs

orientation string

Show image results with horizontal or vertical orientation

Valid values: horizontal, vertical

page integer

Page number

Minimum: 1

Default: 1

people_age string

Show images that feature people of the specified age category

Valid values: infants, children, teenagers, 20s, 30s, 40s, 50s, 60s, older

people_ethnicity [string]

Show images with people of the specified ethnicities, or start with NOT to show images without those ethnicities

Valid values: african, african_american, black, brazilian, chinese, caucasian, east_asian, hispanic, japanese, middle_eastern, native_american, pacific_islander, south_asian, southeast_asian, other, NOT african, NOT african_american, NOT black, NOT brazilian, NOT chinese, NOT caucasian, NOT east_asian, NOT hispanic, NOT japanese, NOT middle_eastern, NOT native_american, NOT pacific_islander, NOT south_asian, NOT southeast_asian, NOT other

people_gender string

Show images with people of the specified gender

Valid values: male, female, both

people_model_released boolean

Show images of people with a signed model release

people_number integer

Show images with the specified number of people

Maximum: 4

per_page integer

Number of results per page

Maximum: 20

Default: 20

query string

One or more search terms separated by spaces; you can use NOT to filter out images that match a term

region string

Raise or lower search result rankings based on the result's relevance to a specified region; you can provide a country code or an IP address from which the API infers a country

One of these formats:

  • Format: A two-character (ISO 3166 Alpha-2) country code
    Example: US
  • Format: A valid IPv4 address
    Example: 1.1.1.1

safe boolean

Enable or disable safe search

Default: true

sort string

Sort by

Default: popular

Valid values: newest, popular, relevance, random

spellcheck_query boolean

Spellcheck the search query and return results on suggested spellings

Default: true

view string

Amount of detail to render in the response

Default: minimal

Valid values: minimal, full

width integer

(Deprecated; use width_from and width_to instead) Show images with the specified width

width_from integer

Show images with the specified width or larger, in pixels

width_to integer

Show images with the specified width or smaller, in pixels

SfxUrl

Example

{
  "$ref": "#/components/schemas/Url/example"
}

Sound effect license URL object

Properties

Name Type Description
url
(Required)
string

URL that can be used to download the unwatermarked, licensed asset

ShortsLoopsStems

Example

{
  "shorts": {
    "short_preview_1": {
      "url": "http://picdn.shuttercorp.net/shutterstock/audio/464947/short_preview_1/short_preview_1.mp3"
    },
    "short_preview_2": {
      "url": "http://picdn.shuttercorp.net/shutterstock/audio/464947/short_preview_2/short_preview_2.mp3"
    }
  },
  "loops": {
    "loop_preview_1": {
      "url": "http://picdn.shuttercorp.net/shutterstock/audio/464947/loop_preview_1/loop_preview_1.mp3"
    },
    "loop_preview_2": {
      "url": "http://picdn.shuttercorp.net/shutterstock/audio/464947/loop_preview_2/loop_preview_2.mp3"
    }
  },
  "stems": {
    "stem_preview_1": {
      "url": "http://picdn.shuttercorp.net/shutterstock/audio/464947/stem_preview_1/stem_preview_1.mp3"
    },
    "stem_preview_2": {
      "url": "http://picdn.shuttercorp.net/shutterstock/audio/464947/stem_preview_1/stem_preview_1.mp3"
    }
  }
}

Links for Shorts, Loops and Stems previews

Properties

Name Type Description
loops

shorts

stems

Subscription

Example

{
  "allotment": {
    "downloads_left": 5,
    "downloads_limit": 10,
    "end_time": "2020-05-29T12:10:22-05:00",
    "start_time": "2020-05-29T12:10:22-05:00"
  },
  "description": "Annual Subscription",
  "expiration_time": "2020-05-29T12:10:22-05:00",
  "formats": [
    {
      "media_type": "image",
      "description": "Small",
      "format": "jpg",
      "min_resolution": 500,
      "size": "small"
    },
    {
      "media_type": "image",
      "description": "Med",
      "format": "jpg",
      "min_resolution": 1000,
      "size": "medium"
    },
    {
      "media_type": "image",
      "description": "Vector",
      "format": "eps",
      "size": "vector"
    }
  ],
  "id": "s8906043",
  "license": "standard",
  "asset_type": "images",
  "metadata": {}
}

Subscription information

Properties

Name Type Description
id
(Required)
string

Unique internal identifier for the subscription

allotment Allotment

An allotment of credits as part of a subscription

asset_type string

Identifier for the type of assets associated with this subscription (images, videos, audio, editorial)

description string

Description of the subscription

expiration_time string

Date the subscription ends Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

formats [LicenseFormat]

List of formats that are licensable for the subscription

license string

Internal identifier for the type of subscription

metadata SubscriptionMetadata

Subscription metadata; different for each customer

price_per_download Price

Price

SubscriptionDataList

Example

{
  "data": [
    {
      "allotment": {
        "downloads_left": 5,
        "downloads_limit": 10,
        "end_time": "2020-05-29T12:10:22-05:00",
        "start_time": "2020-05-29T12:10:22-05:00"
      },
      "description": "Annual Subscription",
      "expiration_time": "2020-05-29T12:10:22-05:00",
      "formats": [
        {
          "media_type": "image",
          "description": "Small",
          "format": "jpg",
          "min_resolution": 500,
          "size": "small"
        },
        {
          "media_type": "image",
          "description": "Med",
          "format": "jpg",
          "min_resolution": 1000,
          "size": "medium"
        },
        {
          "media_type": "image",
          "description": "Vector",
          "format": "eps",
          "size": "vector"
        }
      ],
      "id": "s8906043",
      "license": "standard",
      "asset_type": "images",
      "metadata": {}
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123455
}

List of subscriptions

Properties

Name Type Description
data [Subscription]

Subscriptions retrieved from this user

errors [Error]

Error list; appears only if there was an error

message string

Optional error message

page integer

Current page that is being queried

per_page integer

Amount of subscriptions to show per page

total_count integer

Total number of subscriptions for this user

SubscriptionMetadata

Example

{
  "job": {
    "is_required": true,
    "name": "client_name"
  },
  "client": {
    "is_required": false,
    "name": "purchase_order"
  },
  "other": {
    "is_required": false,
    "name": "custom_value"
  }
}

Subscription metadata; different for each customer

Suggestions

Example

{
  "data": [
    "cat scan",
    "cats and dogs",
    "cats playing",
    "catsuit",
    "cat silhouette",
    "catskills",
    "cats eyes",
    "cat sitting",
    "cat sleeping",
    "cats eye"
  ]
}

List of search suggestions

Properties

Name Type Description
data [string]

Search suggestions

TestEcho

Example

{
  "text": "Test string"
}

Text to echo in the response

Properties

Name Type Description
text string

TestValidate

Example

{
  "header": {
    "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
  },
  "query": {
    "id": 123456,
    "tag": [
      "Test string"
    ]
  }
}

Validation results

Properties

Name Type Description
header TestValidateHeader

Headers as included in the request

query TestValidateQuery

Query as included in the request

TestValidateHeader

Example

{
  "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
}

Validation results

Properties

Name Type Description
user-agent string

User agent to expect in the response

TestValidateQuery

Example

{
  "id": 123456,
  "tag": [
    "string"
  ]
}

Validation results

Properties

Name Type Description
id
(Required)
integer

Integer ID that was passed in the request

tag [string]

List of tags that were passed in the request

Thumbnail

Example

{
  "height": 100,
  "url": "https://thumb7.shutterstock.com/thumb_large/250738318/1572478477/stock-photo-cropped-image-of-woman-gardening-1572478477.jpg",
  "width": 150
}

Image thumbnail information

Properties

Name Type Description
height
(Required)
integer

Height in pixels of the image thumbnail

url
(Required)
string

Direct URL to the image

width
(Required)
integer

Width in pixels of the image thumbnail

UpdateCatalogCollection

Example

{
  "name": "My Collection",
  "visibility": "public",
  "cover_asset": {
    "id": "123"
  }
}

Properties

Name Type Description
cover_asset object

name string

Minimum length: 1

Maximum length: 100000

visibility string

Valid values: private, public

UpdatedMedia

Example

{
  "id": "123456789",
  "updated_time": "2020-05-29T12:10:22-05:00",
  "updates": [
    "addition",
    "edit"
  ]
}

Information about a piece of updated media

Properties

Name Type Description
id
(Required)
string

ID of the media

updated_time
(Required)
string

Date that the media was updated Format: YYYY-MM-DDTHH:mm:ssZ
Example: 2021-03-29T13:25:13.521Z

updates
(Required)
[string]

Types of updates that were made to the piece of media

UpdatedMediaDataList

Example

{
  "data": [
    {
      "id": "123456789",
      "updated_time": "2020-05-29T12:10:22-05:00",
      "updates": [
        "addition",
        "edit"
      ]
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 13
}

List of updated media

Properties

Name Type Description
data [UpdatedMedia]

Updated media items

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

total_count integer

Total count of all results across all pages

Url

Example

{
  "url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.jpg"
}

URL object

Properties

Name Type Description
url
(Required)
string

URL that can be used to download the unwatermarked, licensed asset

Urls

Example

{
  "urls": [
    "string"
  ]
}

List of URLs

Properties

Name Type Description
urls
(Required)
[string]

URLs

UserDetails

Example

{
  "id": "101782699",
  "username": "jdoe",
  "full_name": "John Doe",
  "first_name": "John",
  "last_name": "Doe",
  "language": "es",
  "contributor_id": "212"
}

User details

Properties

Name Type Description
contributor_id string

Unique internal identifier of the user, as a contributor

customer_id string

Unique internal identifier of the user, as a purchaser

email string

Email address of the user

first_name string

First name of the user

full_name string

Full name including first, middle, and last name of the user

id string

Unique internal identifier for the user, not tied to contributor or purchasing customer

is_premier boolean

True if the user has access to the Premier collection, false otherwise

is_premier_parent boolean

True if the user has access to the Premier collection and also has child users

language string

Main language of the user account

last_name string

Last name of the user

only_enhanced_license boolean

True if the user has an enterprise license, false otherwise

only_sensitive_use boolean

True if the user has access to sensitive use only, false otherwise

organization_id string

Unique internal identifier for the user's organization, specific to Premier users

premier_permissions [string]

List of permissions allowed through the Premier client

username string

User name associated to the user

Video

Example

{
  "id": "1033184651",
  "added_date": "2019-07-13",
  "aspect": 1.778,
  "aspect_ratio": "16:9",
  "assets": {
    "thumb_webm": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
    },
    "thumb_mp4": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
    },
    "preview_webm": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
    },
    "preview_mp4": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
    },
    "thumb_jpgs": {
      "urls": [
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/1.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/2.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/3.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/4.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/5.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/6.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/7.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/8.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/9.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/10.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/11.jpg",
        "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
      ]
    },
    "thumb_jpg": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
    },
    "preview_jpg": {
      "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
    },
    "sd": {
      "height": 480,
      "width": 852,
      "fps": 29.97,
      "format": "mov",
      "file_size": 4577280,
      "display_name": "Standard Definition MPEG",
      "is_licensable": true
    },
    "web": {
      "height": 240,
      "width": 426,
      "fps": 29.97,
      "format": "mov",
      "file_size": 1291264,
      "display_name": "Low Resolution MPEG",
      "is_licensable": true
    },
    "hd": {
      "height": 1080,
      "width": 1920,
      "fps": 29.97,
      "format": "avc1",
      "file_size": 110359552,
      "display_name": "Original HD",
      "is_licensable": true
    }
  },
  "categories": [
    {
      "name": "Nature",
      "id": "12"
    },
    {
      "name": "People",
      "id": "13"
    }
  ],
  "contributor": {
    "id": "4411978"
  },
  "description": "Camera follows hipster millennial young woman in orange jacket running up on top of mountain summit at sunset, jumps on top of rocks, raises arms into air, happy and drunk on life, youth and happiness",
  "duration": 14.081,
  "has_model_release": true,
  "has_property_release": false,
  "is_adult": false,
  "is_editorial": false,
  "keywords": [
    "active",
    "activity",
    "adventure",
    "arms",
    "backpacker",
    "carefree",
    "celebrating",
    "cliff",
    "climate",
    "cloud",
    "discovery",
    "escape",
    "explore",
    "extreme",
    "free",
    "freedom",
    "girl",
    "happy",
    "high",
    "hiker",
    "hiking",
    "hill",
    "independent",
    "inspiration",
    "landscape",
    "leisure",
    "lifestyle",
    "mountain",
    "mountains",
    "nature",
    "outdoor",
    "peak",
    "person",
    "rock",
    "scenic",
    "sky",
    "sport",
    "success",
    "summer",
    "summit",
    "sun",
    "sunset",
    "top",
    "tourism",
    "travel",
    "trekking",
    "vacation",
    "view",
    "winning",
    "woman"
  ],
  "media_type": "video",
  "models": [
    {
      "id": "33233810"
    },
    {
      "id": "25487168"
    }
  ]
}

Information about a video

Properties

Name Type Description
contributor
(Required)
Contributor

Information about a contributor

id
(Required)
string

ID of the video

media_type
(Required)
string

Media type of this video, should always be "video"

added_date string

Date this video was added to the Shutterstock library Format: YYYY-MM-DD
Example: 2020-05-29

affiliate_url string

Affiliate referral link; appears only for registered affiliate partners Format: A valid URI
Example: https://wwww.shutterstock.com

aspect number

Aspect ratio of this video in decimal format, such as 0.6667

aspect_ratio string

Aspect ratio of the video as a ratio, such as 16:9

assets VideoAssets

Video asset information

categories [Category]

List of categories

description string

Description of this video

duration number

Duration of this video, in seconds

has_model_release boolean

Whether or not this video has been released for use by the model appearing in it

has_property_release boolean

Whether or not this video has received a release to show the landmark or property appearing in it

is_adult boolean

Whether or not this video contains adult content

is_editorial boolean

Whether or not this video is editorial content

keywords [string]

Keywords associated with the content of this video

models [Model]

List of models in this video

releases [ModelRelease]

List of all releases of this video

url string

Link to video information page; included only for certain accounts

VideoAssets

Example

{
  "thumb_webm": {
    "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
  },
  "thumb_mp4": {
    "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
  },
  "preview_webm": {
    "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
  },
  "preview_mp4": {
    "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
  },
  "thumb_jpgs": {
    "urls": [
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/1.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/2.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/3.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/4.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/5.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/6.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/7.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/8.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/9.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/10.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/11.jpg",
      "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
    ]
  },
  "thumb_jpg": {
    "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
  },
  "preview_jpg": {
    "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
  },
  "sd": {
    "height": 480,
    "width": 852,
    "fps": 29.97,
    "format": "mov",
    "file_size": 4577280,
    "display_name": "Standard Definition MPEG",
    "is_licensable": true
  },
  "web": {
    "height": 240,
    "width": 426,
    "fps": 29.97,
    "format": "mov",
    "file_size": 1291264,
    "display_name": "Low Resolution MPEG",
    "is_licensable": true
  },
  "hd": {
    "height": 1080,
    "width": 1920,
    "fps": 29.97,
    "format": "avc1",
    "file_size": 110359552,
    "display_name": "Original HD",
    "is_licensable": true
  },
  "original_filename": "123.mp4"
}

Video asset information

Properties

Name Type Description
4k VideoSizeDetails

Video asset information

hd VideoSizeDetails

Video asset information

preview_jpg Url

URL object

preview_mp4 Url

URL object

preview_webm Url

URL object

sd VideoSizeDetails

Video asset information

thumb_jpg Url

URL object

thumb_jpgs Urls

List of URLs

thumb_mp4 Url

URL object

thumb_webm Url

URL object

web VideoSizeDetails

Video asset information

VideoCollectionItemDataList

Example

{
  "data": [
    {
      "added_time": "2016-08-18T18:52:59-04:00",
      "id": "76688182",
      "media_type": "video"
    },
    {
      "added_time": "2016-08-18T18:52:59-04:00",
      "id": "40005859",
      "media_type": "video"
    }
  ],
  "page": 1,
  "per_page": 100
}

List of items in a collection

Properties

Name Type Description
data [CollectionItem]

Assets in the collection

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

The current page of results

per_page integer

The number of results per page

total_count integer

The total number of results across all pages

VideoDataList

Example

{
  "data": [
    {
      "id": "1033184651",
      "added_date": "2019-07-13",
      "aspect": 1.778,
      "aspect_ratio": "16:9",
      "assets": {
        "thumb_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "thumb_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "preview_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "preview_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "thumb_jpgs": {
          "urls": [
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/1.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/2.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/3.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/4.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/5.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/6.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/7.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/8.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/9.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/10.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/11.jpg",
            "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
          ]
        },
        "thumb_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        },
        "preview_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        },
        "sd": {
          "height": 480,
          "width": 852,
          "fps": 29.97,
          "format": "mov",
          "file_size": 4577280,
          "display_name": "Standard Definition MPEG",
          "is_licensable": true
        },
        "web": {
          "height": 240,
          "width": 426,
          "fps": 29.97,
          "format": "mov",
          "file_size": 1291264,
          "display_name": "Low Resolution MPEG",
          "is_licensable": true
        },
        "hd": {
          "height": 1080,
          "width": 1920,
          "fps": 29.97,
          "format": "avc1",
          "file_size": 110359552,
          "display_name": "Original HD",
          "is_licensable": true
        }
      },
      "categories": [
        {
          "name": "Nature",
          "id": "12"
        },
        {
          "name": "People",
          "id": "13"
        }
      ],
      "contributor": {
        "id": "4411978"
      },
      "description": "Camera follows hipster millennial young woman in orange jacket running up on top of mountain summit at sunset, jumps on top of rocks, raises arms into air, happy and drunk on life, youth and happiness",
      "duration": 14.081,
      "has_model_release": true,
      "has_property_release": false,
      "is_adult": false,
      "is_editorial": false,
      "keywords": [
        "active",
        "activity",
        "adventure",
        "arms",
        "backpacker",
        "carefree",
        "celebrating",
        "cliff",
        "climate",
        "cloud",
        "discovery",
        "escape",
        "explore",
        "extreme",
        "free",
        "freedom",
        "girl",
        "happy",
        "high",
        "hiker",
        "hiking",
        "hill",
        "independent",
        "inspiration",
        "landscape",
        "leisure",
        "lifestyle",
        "mountain",
        "mountains",
        "nature",
        "outdoor",
        "peak",
        "person",
        "rock",
        "scenic",
        "sky",
        "sport",
        "success",
        "summer",
        "summit",
        "sun",
        "sunset",
        "top",
        "tourism",
        "travel",
        "trekking",
        "vacation",
        "view",
        "winning",
        "woman"
      ],
      "media_type": "video",
      "models": [
        {
          "id": "33233810"
        },
        {
          "id": "25487168"
        }
      ]
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 25
}

List of videos

Properties

Name Type Description
data [Video]

Videos

errors [Error]

Error list; appears only if there was an error

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

total_count integer

Total count of all results across all pages

VideoPreviewUrl

Example

{
  "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
}

Video preview information

Properties

Name Type Description
url
(Required)
string

Direct URL to the image

VideoSearchResults

Example

{
  "data": [
    {
      "id": "1033184651",
      "aspect": 1.778,
      "aspect_ratio": "16:9",
      "assets": {
        "thumb_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "thumb_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "preview_webm": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.webm"
        },
        "preview_mp4": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/preview/stock-footage-camera-follows-hipster-millennial-young-woman-in-orange-jacket-running-up-on-top-of-mountain-summit.mp4"
        },
        "thumb_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        },
        "preview_jpg": {
          "url": "https://ak.picdn.net/shutterstock/videos/1033184651/thumb/12.jpg"
        }
      },
      "contributor": {
        "id": "4411978"
      },
      "description": "Camera follows hipster millennial young woman in orange jacket running up on top of mountain summit at sunset, jumps on top of rocks, raises arms into air, happy and drunk on life, youth and happiness",
      "duration": 14.081,
      "has_model_release": true,
      "media_type": "video"
    }
  ],
  "page": 1,
  "per_page": 5,
  "total_count": 123,
  "search_id": "749090bb-2967-4a20-b22e-c800dc845e10"
}

Video search results

Properties

Name Type Description
data
(Required)
[Video]

List of videos

search_id
(Required)
string

Unique identifier for the search request

total_count
(Required)
integer

Total count of all results across all pages

message string

Server-generated message, if any

page integer

Current page that is returned

per_page integer

Number of results per page

VideoSizeDetails

Example

{
  "height": 1080,
  "width": 1920,
  "fps": 29.97,
  "format": "avc1",
  "file_size": 110359552,
  "display_name": "Original HD",
  "is_licensable": true
}

Video asset information

Properties

Name Type Description
display_name string

Display name of this video size

file_size integer

File size (in bytes) of this video size

format string

Format of this video size

fps number

Frames per second of this video size

height integer

Height of this video size

is_licensable boolean

Whether or not videos can be licensed in this video size

width integer

Width of this video size

Feedback

To report issues or provide feedback on the API itself, the API reference information, or the developer portal, use this feedback board: https://api-feedback.shutterstock.com.

Release notes

2024-01-22 (v1.1.38)

Adds affiliate_url to sound effects asset.

2023-12-07 (v1.1.37)

Adds content_tiers to allotment section of user subscriptions, which list all downloads left and downloads limit for each content tier in a license. Now calculates the default downloads left and limit based on the lowest content tier.

2023-10-23 (v1.1.36)

Adds missing releases field to video schema

2023-05-18 (v1.1.35)

Updates license parameter description for:

2023-05-08 (v1.1.34)

Deprecate Custom Music from the API

2023-04-25 (v1.1.33)

Changes per_page max limit to 200 on similar videos endpoint.

2023-02-10 (v1.1.32)

Adds SFX Redownloads endpoint.

2022-10-06 (v1.1.31)

Exposes SFX Endpoints.

2022-10-06 (No version update)

Update the POST /v2/images/licenses endpoint to return the watermarked preview_1500 version of the image if one exists, or a preset sample image if it does not

2022-09-12 (v1.1.30)

Adds new license history query parameter team_history which allows team members to see all other team members history

2022-07-29 (v1.1.28)

Removes redundant per_query parameter from bulk search images endpoint

2022-07-28 (v1.1.27)

Exposes new endpoint for running multiple image searches.

2022-07-25 (v1.1.26)

Exposes Shorts, Loops and Stems on Audio Endpoints.

2022-07-12 (v1.1.25)

Increase per_page minimum limit to 2 on GET /v2/catalog/collections

2022-07-12 (v1.1.24)

Reduces per_page maximum limit to 50 on GET /v2/catalog/collections

2022-06-14 (v1.1.22)

Deprecating format parameter in [POST /v2/images/license] endpoint; see License images

2022-05-16 (v1.1.21)

Provide machine-translated descriptions for images in image endpoints; see Languages

2022-04-06 (v1.1.20)

Reduces per_page maximum limit to 100 on GET /v2/catalog/collections

2022-03-30 (v1.1.19)

Adds role assignments to collection responses on Catalog endpoints:

2022-03-23 (v1.1.18)

Adds a new revshare object in the response of license history endpoints for users who are using a revenue-sharing subscription

2022-03-21 (v1.1.17)

Adds a new query parameter download_availability on the following endpoints:

2022-03-14 (v1.1.16)

Allows shared collections to be searched by collection_id GET /v2/catalog/search

2022-02-28 (v1.1.15)

Enables multiple collection_id to GET /v2/catalog/search

2022-02-24 (v1.1.14)

Adds new license type asset_all_music to POST /v2/audio/licenses

2022-01-26 (v1.1.13)

Removes video editor endpoints: POST /v2/editor/customers, PATCH /v2/editor/customers, and POST /v2/editor/auth

2022-01-11 (v1.1.11)

Adds catalog collections item management to the API

2021-12-23 (v1.1.10)

Adds catalog collections to the API

Contact us if you would like to have access to the Catalog API.

2021-10-22 (v1.1.9)

2021-10-11 (v1.1.8)

2021-09-20 (v1.1.7)

2021-09-16 (v1.1.6)

2021-08-17 (v1.1.5)

2021-07-22 (v1.1.4)

2021-07-21 (v1.1.3)

2021-06-09 (v1.1.2)

2021-05-21 (v1.1.1)

2021-05-04 (v1.1.0)

2021-04-21 (v1.0.37)

2021-03-24 (v1.0.35)

2021-03-01 (v1.0.34)

2021-02-05 (v1.0.33)

2020-01-15 (v1.0.32)

2020-01-06 (v1.0.31)

2020-12-21 (v1.0.30)

2020-12-21 (v1.0.29)

2020-11-16 (v1.0.28)

2020-09-24 (v1.0.27)

2020-08-31 (v1.0.26)

2020-08-28 (v1.0.25)

2020-05-27 (v1.0.24)

Add the region parameter to the image search endpoint to provide results that are targeted to a country

2020-05-26 (v1.0.23)

Update image search endpoint to filter by aspect_ratio_max, aspect_ratio_min, and aspect_ratio

2020-05-20 (No version update)

Updated documentation to reflect CV file size limits. Images can be no larger than 10mb and can be no larger than 10,000 pixels in width or height.

2020-05-13 (v1.0.22)

Added the GET /v2/editorial/categories list editorial categories endpoint.

2020-05-05 (v1.0.21)

Added two new filter options license and safe to the CV similar assets endpoints. license defaults to commercial, but can be set to return editorial and enhanced. safe defaults to true, but can be toggled off. See (GET /v2/cv/similar/images) and (GET /v2/cv/similar/videos).

2020-04-28 (v1.0.20)

Added the GET /v2/editorial/updated editorial list updated content endpoint.

2020-03-25 (v1.0.19)

The SDK now returns huge_thumb asset for applicable image endpoints.

2020-02-04 (v1.0.18)

The SDK now supports being imported on front-end frameworks (React, Vue, etc..).

2020-01-20 (v1.0.17)

Added the GET /v2/cv/keywords computer vision keywords endpoint.

2019-11-08 (v1.0.16)

The POST /v2/images endpoint is deprecated. Use the POST /v2/cv/images reverse image search endpoint instead.

2019-08-29 (v1.0.15)

Added zh-Hant as an acceptable language parameter for search and translated responses.

2019-08-13 (No version update)

Access to the similar images endpoint (GET /v2/images/{id}/similar) is now restricted.

2019-08-07 (v1.0.14)

Update image and video search:

Added Basic auth as an authentication method for Featured collections endpoints.

2019-07-19 (v1.0.13)

The SDK now supports the language parameter on endpoints that can accept or return data in languages other than English.

2019-07-11 (v1.0.12)

Update audio search sort parameter :

2019-07-08 (v1.0.11)

The SDK is now able to use the licensing sandbox using the new setSandbox method.

2019-07-02 (v1.0.10)

The API now provides access to the GET /v2/audio/genres, GET /v2/audio/instruments, and GET /v2/audio/moods endpoints. These endpoints provide the list of acceptable genres, instruments, and moods respectively that can be passed as query parameters to the GET /v2/audio/search endpoint.

2019-06-19 (v1.0.9)

Adds new Premier license types for audio licensing

2019-06-19 (v1.0.8)

Bugfix to provide a User-Agent string for requests to the API made using the JavaScript SDK.

2019-06-19 (v1.0.7)

Update audio search:

2019-06-10 (v1.0.6)

Remove unused LicenseAgreement schema from JavaScript SDK.

2019-06-06 (v1.0.5)

The API now provides access to the GET /v2/images/updated and GET /v2/videos/updated endpoints. These endpoints provide information about updated images and videos so content management systems (CMS) or digital asset management (DAM) systems can keep their libraries up to date. For access to these endpoints, contact us.

2019-05-09 (v1.0.4)

The API now uses API subscriptions that are independent of subscriptions on shutterstock.com. Which subscription you have controls what you can access and do with the API.

For more information, see Subscriptions

2019-05-01 (v1.0.3)

Update LicenseImage, LicenseVideo and LicenseEditorialContent schemas' metadata property to link to new LicenseRequestMetadata schema.

2019-04-26 (v1.0.2)

Update the valid values of the size property in LicenseFormat for video subcriptions to give more detail.

This affects the list user subscriptions endpoint.

2019-03-29 (v1.0.1)

The JavaScript SDK is now available. Examples in the documentation use this SDK, but JavaScript clients can still make HTTP requests directly.

2019-03-26

Improve error details for restricted content:

2019-02-05

Limit the use of the API for accounts that do not have an active or inactive paid subscription:

2018-12-06

2018-10-24

2018-08-08

2018-07-27