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:
- 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.
- 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.
- Use the
GET /v2/user/subscriptions
endpoint to get your subscription ID. - 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:
SHUTTERSTOCK_API_TOKEN
: To use OAuth authentication, put your OAuth token in this variable.SHUTTERSTOCK_KEY
: To use basic authentication, put your application's consumer key in this variable.SHUTTERSTOCK_SECRET
: To use basic authentication, put your application's consumer secret in this variable.SHUTTERSTOCK_SANDBOX
: Set totrue
to use the licensing sandbox.SHUTTERSTOCK_CLI_COLORIZE_OUTPUT
: Set totrue
to colorize the output from the CLI.
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:
Most image and video endpoints can return metadata such as categories and keywords in the specified language. For example, the
GET /v2/images/categories
endpoint can provide the image categories in multiple languages.Image endpoints such as the
GET /v2/images/search
andGET /v2/images/{id}
endpoints can return translated descriptions for images.The
GET /v2/images/search
andGET /v2/videos/search
endpoints can accept search terms in languages other then English. For examples of searching in different languages, see Localizing searches.
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:
- "newest": Sort by when the image or video was added.
- "popular": Sort by the popularity of the image or video, returning images or videos that are often downloaded as a result of searches with similar keywords.
- "random": Return the search results in random order. Random searches are limited to 20 results per page.
- "relevance": Sort by how well the result matches the keywords. Relevance also takes into account the age of the media and the popularity of the media.
The audio search endpoint can sort results in the following ways:
- "artist": Sort by the artist name.
- "bpm": Sort by beats per minute.
- "duration": Sort by the length of the track.
- "freshness": Sort by when the track was added.
- "ranking_all": Sort by aggregated factors including popularity, keywords, and views.
- "score": Sort by the relevancy score based on the search query.
- "title": Sort alphabetically by title.
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:
- RateLimit-Limit - The allowed quota count.
- RateLimit-Remaining - The available quota count in the quota interval.
- RateLimit-Reset - The UTC time in milliseconds which determines when the quota expires and new quota interval starts.
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:
- Log in at shutterstock.com, go to your account page, and click Developers.
- On the Developers page, click Create new app.
- 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.
- 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);
});
- Create an account at https://www.shutterstock.com if you don't already have one.
- Set up an application at https://www.shutterstock.com/account/developers/apps and get the consumer key and consumer secret from the application.
- 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:
- Create an account at https://www.shutterstock.com if you don't already have one.
- Set up an application at https://www.shutterstock.com/account/developers/apps.
- On the application details page, under Token, click Generate token.
- 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.
- Click Continue.
- 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);
});
Create an account at https://www.shutterstock.com if you don't already have one.
Set up an application at https://www.shutterstock.com/developers and get the consumer key and consumer secret from the application.
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.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 inhttp://localhost:3000/callback
.)response_type
: Specifycode
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
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:
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.Finally, authenticate to the API and get an access token. To request a token that does not expire, specify
expires=false
or omit theexpires
parameter. To request a token that expires after one hour and then can be refreshed, specifyexpires=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:
refresh_token
: The refresh token from the initial request to thePOST /v2/oauth/access_token
endpoint.grant_type
: Specify "refresh_token" to refresh the token.client_id
: The consumer key from your application on https://www.shutterstock.com/developers.client_secret
: The consumer secret from your application. You must pass either this field or theuser_id
field.user_id
: The ID uf the user account that is associated with the token. You must pass either this field or theclient_secret
field. As long as the current token is active, you can retrieve the user ID from theGET /v2/user
endpoint.
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:
- Images:
GET https://api.shutterstock.com/v2/images/search
- Video:
GET https://api.shutterstock.com/v2/videos/search
- Audio:
GET https://api.shutterstock.com/v2/audio/search
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.
- AND is added implicitly between each search keyword.
Therefore, searching for
dog AND cat
is equivalent to searching fordog cat
. - OR searches for results that include any of the specified keywords, such as
dog OR cat OR mouse
. - NOT searches exclude keywords from search results, such as
dog NOT hot dog
. You can also use NOT in thecontributor
search field.
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:
- "newest": Sort by when the image was added.
- "popular": Sort by the popularity of the image or video, returning images or videos that are often downloaded as a result of searches with similar keywords.
- "random": Return the search results in random order.
- "relevance": Sort by how well the result matches the keywords. Relevance also takes into account the age of the media and the popularity of the media.
The audio search endpoint can sort results in the following ways:
- "artist": Sort by the artist name.
- "bpm": Sort by beats per minute.
- "duration": Sort by the length of the track.
- "freshness": Sort by when the track was added.
- "ranking_all": Sort by aggregated factors including popularity, keywords, and views.
- "score": Sort by the relevancy score based on the search query.
- "title": Sort alphabetically by title.
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:
- Search for images
- Search for videos
- Search for tracks
- Search editorial images
- Search editorial video
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.
Safe search
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:
By default, the
safe
parameter is set to true to enable safe search, which hides media with the Mature Content designation. Shutterstock's content guidelines require contributors to use this designation to manually flag media with sexual content, graphic medical scenes, vulgar language, or other mature subject matter. Flagging media in this way is a subjective decision. For more information, see Why was my content rejected for Mature Content Designation?.By default, the
keyword_safe_search
parameter is set to true, which hides media based on a list of keywords. Any media with one of the keywords is removed from API responses. The keywords include words related to nudity, offensive language, bodily fluids, drug use, racism, weapons, and violence.
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.
Computer vision search
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.
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.
- small_thumb: Scaled until the larger dimension is 100px, no watermark.
- large_thumb: Scaled until the larger dimension is 150px, no watermark.
- mosaic: Scaled until the larger dimension is 250px, no watermark.
- huge_thumb: Scaled to 260px in height, no watermark. This size is available only to paying API customers.
- preview: Scaled until the larger dimension is 450px, watermarked.
- preview_1000: Scaled until the larger dimension is 1000px, watermarked. This size is available only to paying API customers.
- preview_1500: Scaled until the larger dimension is 1500px, watermarked. This size is available only to paying API customers.
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);
});
- An access token with the licenses.create, licenses.view, and purchases.view scopes. See Authentication.
- An active subscription that is valid for the type and size of media that you want to download.
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:
Licensing requests don't deduct credits from your subscription or provide licenses. The response includes an
allotment_charge
field as usual, but that allotment charge is not deducted from your subscription.Licensing requests return different things depending on the endpoint that you use:
- Requests to the
POST /v2/images/licenses
endpoint return the watermarked preview_1500 version of the image if one exists, or a preset sample image if it does not. - Requests to the
POST /v2/videos/licenses
andPOST /v2/audio/licenses
endpoints provide a preset sample file. - Requests to the
POST /v2/editorial/images/licenses
endpoint in the sandbox fail.
- Requests to the
License history requests provide information about your sandbox licensing requests.
For example, if you make requests to the the
POST /v2/images/licenses
endpoint in the sandbox, requests to theGET /v2/images/licenses
endpoint return information about those sandbox requests. In the sandbox, the license history endpoints return information only about sandbox licenses, not licenses that you created with the main API. The API stores license history in the sandbox for at least one week and then resets it.Redownload requests allow you to simulate redownloading media that you previously licensed with the sandbox endpoints.
For example, you can pass the ID of a sandbox image license to the
POST /v2/images/licenses/{id}/downloads
sandbox endpoint. If the license ID matches a license that you created in the sandbox and the license permits redownloads, the redownload endpoint returns a 200 OK code and a link to a preset sample file.
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:
You can create collections of a single asset type, which are custom lists of a single type of Shutterstock asset, including images, videos, and audio tracks. You can create any number of collections and access them through the API or at shutterstock.com. Single-asset-type collections will be deprecated, so use catalog collections if your account has access to them.
To work with collections through the API, see the appropriate section in the API reference:
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);
Enterprise and SMB users organize media in catalogs, which include Shutterstock assets and files that users upload. These users can create catalog collections, which are custom lists of assets and files from a catalog.
Enterprise and SMB users are grouped into organizations, which represent the enterprise or business that they belong to. Each organization has a catalog of Shutterstock assets and files that their users upload, and each user within an organization has access to that catalog.
Through the API, enterprise and SMB users can search catalogs, create catalog collections, and add Shutterstock assets to them, including images, videos, audio tracks, and editorial media. To add their own files and do other work with catalogs and catalog collections, they must access their catalogs with a web browser at shutterstock.com.
To work with catalog collections through the API, see the endpoints in the Catalog section.
Assets API
The endpoints in the Assets API provide access to Shutterstock assets, including images, videos, audio tracks, and editorial media.
Images
Search
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-DDExample: 2020-05-29 |
added_date_end | string |
Show images added before the specified date Format: YYYY-MM-DDExample: 2020-05-29 |
added_date_start | string |
Show images added on or after the specified date Format: YYYY-MM-DDExample: 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:
|
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) |
library | [string] |
Search within different Shutterstock owned libraries Default: shutterstock Valid values: shutterstock, offset |
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:
|
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
- Basic
- Customer OAuth (No scope required.)
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-DDExample: 2020-05-29 |
added_date_end | string |
Show images added before the specified date Format: YYYY-MM-DDExample: 2020-05-29 |
added_date_start | string |
Show images added on or after the specified date Format: YYYY-MM-DDExample: 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:
|
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:
|
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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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: |
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
- Basic
- Customer OAuth (No scope required.)
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 recommended images
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
- Basic
- Customer OAuth (No scope required.)
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. The API will default to UTC (00:00:00) if no specific time is provided, ensuring consistency. Please note that the end date must be at least 5 minutes after the start date. Format: Access both date & date-timeExample: 2020-05-29 OR 2021-03-29T13:25:00Z |
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. The API will default to UTC (00:00:00) if no specific time is provided, ensuring consistency. Format: Access both date & date-timeExample: 2020-05-29 OR 2021-03-29T13:25:00Z |
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
- Basic
- Customer OAuth (No scope required.)
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 digitsExample: 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
- Basic
- Customer OAuth (No scope required.)
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 digitsExample: 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
- Basic
- Customer OAuth (No scope required.)
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
-
Customer OAuth
Required scopes:
- licenses.create
- purchases.view
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:ssZExample: 2021-03-29T13:25:13.521Z Must be > than start_date |
image_id | string |
Show licenses for the specified image ID Format: |
license | string |
Show images that are available with the specified license, such as Format: |
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:ssZExample: 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
-
Customer OAuth
Required scopes:
- licenses.view
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
-
Customer OAuth
Required scopes:
- licenses.view
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
-
Customer OAuth
Required scopes:
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.edit
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
|
||
media_type | string |
The media type of the item, such as image, video, or audio
|
Accepted authentication
-
Customer OAuth
Required scopes:
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.edit
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 |
Featured Collections
List featured image collections
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
- Basic
- Customer OAuth (No scope required.)
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 |
Get the details of featured image collections
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
- Basic
- Customer OAuth (No scope required.)
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 |
Get the contents of featured image collections
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
- Basic
- Customer OAuth (No scope required.)
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
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-DDExample: 2020-05-29 |
added_date_end | string |
Show videos added before the specified date Format: YYYY-MM-DDExample: 2020-05-29 |
added_date_start | string |
Show videos added on or after the specified date Format: YYYY-MM-DDExample: 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 codeExample: 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 |
orientation | string |
Search for videos in a specific orientation Valid values: vertical, horizontal |
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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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 digitsExample: 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
- Basic
- Customer OAuth (No scope required.)
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. The API will default to UTC (00:00:00) if no specific time is provided, ensuring consistency. Please note that the end date must be at least 5 minutes after the start date. Format: Access both date & date-timeExample: 2020-05-29 OR 2021-03-29T13:25:00Z |
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. The API will default to UTC (00:00:00) if no specific time is provided, ensuring consistency. Format: Access both date & date-timeExample: 2020-05-29 OR 2021-03-29T13:25:00Z |
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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 digitsExample: 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
- Basic
- Customer OAuth (No scope required.)
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 digitsExample: 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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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
-
Customer OAuth
Required scopes:
- licenses.create
- purchases.view
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:ssZExample: 2021-03-29T13:25:13.521Z Must be > than start_date |
license | string |
Show videos that are available with the specified license, such as Format: |
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:ssZExample: 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: |
Accepted authentication
-
Customer OAuth
Required scopes:
- licenses.view
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
-
Customer OAuth
Required scopes:
- licenses.view
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
-
Customer OAuth
Required scopes:
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.edit
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
|
||
media_type | string |
The media type of the item, such as image, video, or audio
|
Accepted authentication
-
Customer OAuth
Required scopes:
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.edit
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 |
Featured Collections
List featured video collections
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
- Basic
- Customer OAuth (No scope required.)
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 |
Get the details of featured video collections
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
- Basic
- Customer OAuth (No scope required.)
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 |
Get the contents of featured video collections
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
- Basic
- Customer OAuth (No scope required.)
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
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 |
instruments | [string] |
Show tracks with each of the specified instruments; to get the list of instruments, use |
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 |
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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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: |
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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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
-
Customer OAuth
Required scopes:
- licenses.create
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:ssZExample: 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:ssZExample: 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
-
Customer OAuth
Required scopes:
- licenses.view
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
-
Customer OAuth
Required scopes:
- licenses.view
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
-
Customer OAuth
Required scopes:
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.edit
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
|
||
media_type | string |
The media type of the item, such as image, video, or audio
|
Accepted authentication
-
Customer OAuth
Required scopes:
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.edit
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
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-DDExample: 2020-05-29 |
added_date_end | string |
Show sound effects added before the specified date Format: YYYY-MM-DDExample: 2020-05-29 |
added_date_start | string |
Show sound effects added on or after the specified date Format: YYYY-MM-DDExample: 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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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 digitsExample: 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
- Basic
- Customer OAuth (No scope required.)
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:ssZExample: 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 Format: |
license_id | string |
Filter by the license ID Format: |
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: |
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:ssZExample: 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: |
Accepted authentication
-
Customer OAuth
Required scopes:
- licenses.view
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
- Basic
- Customer OAuth (No scope required.)
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
-
Customer OAuth
Required scopes:
- licenses.view
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
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 codeExample: 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-DDExample: 2020-05-29 |
date_start | string |
Show only editorial content generated on or after a specific date Format: YYYY-MM-DDExample: 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
- Basic
- Customer OAuth (No scope required.)
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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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 codeExample: 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:ssZExample: 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:ssZExample: 2021-03-29T13:25:13.521Z |
type
(Required) |
string |
Specify 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-DDExample: 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-DDExample: 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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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 codeExample: USA |
id
(Required) |
string |
Editorial ID |
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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 |
list editorial image details
curl -X GET "https://api.shutterstock.com/v2/editorial/images" \
-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.listEditorialImages(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/images" . 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 list-editorial-images \
--country USA \
--search_id 00000000-0000-0000-0000-000000000000
GET
/v2/editorial/images
Try it out
This endpoint lists the details of editorial images.
Parameters
Parameter | Type | Description |
---|---|---|
country
(Required) |
string |
Show only editorial image content that is available for distribution in a certain country Format: A three-character (ISO 3166 Alpha-3) country codeExample: USA |
id
(Required) |
[string] |
ID of the editorial image to list details for Maximum: 150 |
search_id | string |
The ID of the search that is related to this request |
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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 | EditorialImageResults |
400 | Bad Request | None |
401 | Unauthorized | None |
403 | Forbidden | 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:ssZExample: 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:ssZExample: 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
-
Customer OAuth
Required scopes:
- licenses.view
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
-
Customer OAuth
Required scopes:
- licenses.create
- purchases.view
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 codeExample: 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
- Basic
- Customer OAuth (No scope required.)
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.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 codeExample: USA |
id
(Required) |
string |
Editorial livefeed ID; must be an URI encoded string |
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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.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 codeExample: USA |
id
(Required) |
string |
Editorial livefeed ID; must be an URI encoded string |
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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 codeExample: USA |
id
(Required) |
string |
Editorial ID |
search_id | string |
The ID of the search that is related to this request |
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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
-
Customer OAuth
Required scopes:
- licenses.create
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 codeExample: 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
- Basic
- Customer OAuth (No scope required.)
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.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 codeExample: USA |
id
(Required) |
string |
Editorial livefeed ID; must be an URI encoded string |
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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.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 codeExample: USA |
id
(Required) |
string |
Editorial livefeed ID; must be an URI encoded string |
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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 codeExample: 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-DDExample: 2020-05-29 |
date_start | string |
Show only editorial content generated on or after a specific date Format: YYYY-MM-DDExample: 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
- Basic
- Customer OAuth (No scope required.)
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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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
- Basic
- Customer OAuth (No scope required.)
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 codeExample: 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:ssZExample: 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:ssZExample: 2021-03-29T13:25:13.521Z |
type
(Required) |
string |
Specify 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-DDExample: 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-DDExample: 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
- Basic
- Customer OAuth (No scope required.)
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
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 codeExample: 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-DDExample: 2020-05-29 |
date_start | string |
Show only editorial video content generated on or after a specific date Format: YYYY-MM-DDExample: 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
- Basic
- Customer OAuth (No scope required.)
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://editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
},
"preview_webm": {
"url": "https://editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
},
"thumb_jpg": {
"url": "https://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
- Basic
- Customer OAuth (No scope required.)
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 codeExample: USA |
id
(Required) |
string |
Editorial ID |
search_id | string |
The ID of the search that is related to this request |
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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://editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
},
"preview_webm": {
"url": "https://editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
},
"thumb_jpg": {
"url": "https://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 |
List editorial videos details by ID list
curl -X GET "https://api.shutterstock.com/v2/editorial/videos" \
-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.listEditorialVideos(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" . 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 list-editorial-videos \
--country USA \
--search_id 00000000-0000-0000-0000-000000000000
GET
/v2/editorial/videos
Try it out
This endpoint lists the details of editorial videos by ID list.
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 codeExample: USA |
id
(Required) |
[string] |
ID of the editorial video to list details for Maximum: 150 |
search_id | string |
The ID of the search that is related to this request |
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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": [
"adorable",
"birds",
"goose"
],
"date_taken": "2020-11-13",
"categories": [],
"aspect": 1,
"assets": {
"preview_mp4": {
"url": "https://editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
},
"preview_webm": {
"url": "https://editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
},
"thumb_jpg": {
"url": "https://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 | EditorialVideoResults |
400 | Bad Request | None |
401 | Unauthorized | None |
403 | Forbidden | 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:ssZExample: 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:ssZExample: 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
-
Customer OAuth
Required scopes:
- licenses.view
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
-
Customer OAuth
Required scopes:
- licenses.create
- purchases.view
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
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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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
- Basic
- Customer OAuth (No scope required.)
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:
|
Accepted authentication
- Basic
- Customer OAuth (No scope required.)
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
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.view
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
-
Customer OAuth
Required scopes:
- collections.view
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.view
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.view
- collections.edit
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
-
Customer OAuth
Required scopes:
- collections.view
- collections.edit
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
- Customer OAuth (No scope required.)
- Basic
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
- Customer OAuth (No scope required.)
- Basic
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
- Customer OAuth (No scope required.)
- Basic
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
- Customer OAuth (No scope required.)
- Basic
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
- Customer OAuth (No scope required.)
- Basic
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
-
Customer OAuth
Required scopes:
- user.view
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
- Customer OAuth (No scope required.)
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
-
Customer OAuth
Required scopes:
- purchases.view
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 |
start_time | string |
Date the subscription started
Format: YYYY-MM-DDTHH:mm:ssZ |
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 |
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 |
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 |
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 |
title | string |
Title of this track |
updated_time | string |
Time this track was last updated
Format: YYYY-MM-DDTHH:mm:ssZ |
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
{
"url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.jpg"
}
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 |
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 |
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 |
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 |
items_updated_time | string |
The last time this collection's items were updated
Format: YYYY-MM-DDTHH:mm:ssZ |
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 |
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 |
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 |
---|---|---|
string |
Facebook link for contributor |
|
google_plus | string |
Google+ link for contributor |
string |
LinkedIn link for contributor |
|
string |
Pinterest page for contributor |
|
tumblr | string |
Tumblr link for contributor |
string |
Twitter link for contributor |
Cookie
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 |
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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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 |
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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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.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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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.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 |
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.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 |
EditorialImageResults
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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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
}
}
}
]
}
List of editorial images
Properties
Name | Type | Description |
---|---|---|
data | [EditorialContent] |
Metadata about editorial content |
search_id | string |
|
total_count | integer |
|
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.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 |
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.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.shuttercorp.net/thumb/10687730b/272a999e/Shutterstock_10687730b.jpg"
},
"thumb_220": {
"height": 136,
"width": 220,
"url": "https://editorial01.shuttercorp.net/thumb-220/10687730b/927a6ebe/Shutterstock_10687730b.jpg"
},
"watermark_450": {
"height": 278,
"width": 450,
"url": "https://editorial01.shuttercorp.net/wm-preview-450/10687730b/ff2443ad/Shutterstock_10687730b.jpg"
},
"watermark_1500": {
"height": 926,
"width": 1500,
"url": "https://editorial01.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 |
date_taken | string |
Format: YYYY-MM-DD |
description | string |
|
keywords | [string] |
|
rights | object |
|
special_instructions | string |
|
supplier_code | string |
|
title | string |
|
updated_time | string |
Format: YYYY-MM-DDTHH:mm:ssZ |
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://editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
},
"preview_webm": {
"url": "https://editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
},
"thumb_jpg": {
"url": "https://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://editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
},
"preview_webm": {
"url": "https://editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
},
"thumb_jpg": {
"url": "https://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 |
description | string |
|
keywords | [string] |
|
title | string |
|
EditorialVideoResults
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": [
"adorable",
"birds",
"goose"
],
"date_taken": "2020-11-13",
"categories": [],
"aspect": 1,
"assets": {
"preview_mp4": {
"url": "https://editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
},
"preview_webm": {
"url": "https://editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
},
"thumb_jpg": {
"url": "https://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
}
}
}
]
}
List of editorial videos
Properties
Name | Type | Description |
---|---|---|
data | [EditorialVideoContent] |
Metadata about editorial content |
search_id | string |
|
total_count | integer |
|
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://editorial-cdn.shuttercorp.net/wm-preview-mp4/10679854a/M0T7A13aNej2g82bMTI4NjY=/Shutterstock_10679854a.mp4"
},
"preview_webm": {
"url": "https://editorial-cdn.shuttercorp.net/wm-preview-webm/10679854a/M4T6A63fN2j5g929MTI4NjY=/Shutterstock_10679854a.webm"
},
"thumb_jpg": {
"url": "https://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 |
FeaturedCollection
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 |
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 |
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 |
FeaturedCollectionCoverItem
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 |
FeaturedCollectionDataList
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 |
affiliate_url | string |
Affiliate referral link; appears only for registered affiliate partners
Format: A valid URI |
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 |
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 |
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 |
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 |
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
- ar
- bg
- bn
- cs
- da
- de
- el
- en
- es
- fi
- fr
- gu
- he
- hi
- hr
- hu
- id
- it
- ja
- kn
- ko
- ml
- mr
- nb
- nl
- or
- pl
- pt
- ro
- ru
- sk
- sl
- sv
- ta
- te
- th
- tr
- uk
- ur
- vi
- zh
- zh-Hant
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 |
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 |
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 |
added_date_end | string |
Show images added before the specified date
Format: YYYY-MM-DD |
added_date_start | string |
Show images added on or after the specified date
Format: YYYY-MM-DD |
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:
|
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:
|
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
{
"url": "https://download.shutterstock.com/gatekeeper/[random-characters]/shutterstock_59656357.jpg"
}
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 |
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 |
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 |
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 |
affiliate_url | string |
Affiliate referral link; appears only for registered affiliate partners
Format: A valid URI |
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 |
is_select | boolean |
Whether or not this video is part of the select collection |
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 |
Release notes
2024-12-11 (v1.1.42)
Removal of all code related to the AI search filter
2024-06-20 (v1.1.41)
Adds support for vertical video search using the orientation
parameter
2024-04-18 (v1.1.40)
Adds new endpoint to list editorial image details
2024-04-09 (v1.1.39)
Adds new endpoint to list Editorial video details
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
- 'GET /v2/images/licenses'
- 'GET /v2/videos/licenses'
- 'GET /v2/audio/licenses'
- 'GET /v2/editorial/images/licenses'
- 'GET /v2/editorial/videos/licenses'
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.
GET /v2/audio/search
GET /v2/audio/
GET /v2/audio/{id}
POST /v2/audio/license
POST /v2/audio/license/{id}/download
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:
- Add collection items
POST /v2/catalog/collections/{collection_id}/items
- Delete collection items
DELETE /v2/catalog/collections/{collection_id}/items
- List catalog collections
GET /v2/catalog/collections
- Create new collections
POST /v2/catalog/collections
- Update collection
PATCH /v2/catalog/collections/{collection_id}
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
- Response now shows the purchase amount and purchase currency from the original license request
- Applicable to
GET /v2/images/licenses
andGET /v2/videos/licenses
- New schema available
DownloadHistoryRevshareDetails
- License history schema updated to include the new DownloadHistoryRevshareDetails schema
2022-03-21 (v1.1.17)
Adds a new query parameter download_availability
on the following endpoints:
- 'GET /v2/images/licenses'
- 'GET /v2/videos/licenses'
- 'GET /v2/audio/licenses'
- 'GET /v2/editorial/images/licenses'
- 'GET /v2/editorial/videos/licenses'
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
- Add collection items
POST /v2/catalog/collections/{collection_id}/items
- Delete collection items
DELETE /v2/catalog/collections/{collection_id}/items
2021-12-23 (v1.1.10)
Adds catalog collections to the API
- Search catalog items
GET /v2/catalog/search
- Fetch catalog collections
GET /v2/catalog/collections
- Create new collections
POST /v2/catalog/collections
- Update collection
PATCH /v2/catalog/collections/{collection_id}
- Delete collection
DELETE /v2/catalog/collections/{collection_id}
Contact us if you would like to have access to the Catalog API.
2021-10-22 (v1.1.9)
- Adds 17 new languages to the API
- Arabic (ar)
- Bangla (bn)
- Bulgarian (bg)
- Croatian (hr)
- Gujarati (gu)
- Hebrew (he)
- Hindi (hi)
- Kannada (kn)
- Malayalam (ml)
- Marathi (mr)
- Odia (or)
- Slovak (sk)
- Slovenian (sl)
- Tamil (ta)
- Telugu (te)
- Ukrainian (uk)
- Urdu (ur)
2021-10-11 (v1.1.8)
- Adds License ID to response for successful licensing events on POST
/images/licenses
,/videos/licenses
,/audio/licenses
,/editorial/images/licenses
, and/editorial/videos/licenses
routes
2021-09-20 (v1.1.7)
- Adds updated Cache-Control response header for
/images/search
endpoint
2021-09-16 (v1.1.6)
- Added special instructions on editorial image search response
2021-08-17 (v1.1.5)
- Added pagination info to image and video collections
- Added share functionality to Audio and Video collections
- All collection endpoints now return the same object
2021-07-22 (v1.1.4)
- Added endpoints for video editing
2021-07-21 (v1.1.3)
- Added new endpoint for editorial video license history
2021-06-09 (v1.1.2)
- Removed references to unreachable response types for collections.
2021-05-21 (v1.1.1)
- Licensing requests are now limited to 50 licenses per request.
2021-05-04 (v1.1.0)
- Updates method names in the JavaScript SDK:
imagesApi.postImageEntities()
is nowimagesApi.getImageKeywordSuggestions()
imagesApi.getImageCategories()
is nowimagesApi.listImageCategories()
imagesApi.createLightbox()
is nowimagesApi.createImageCollection()
imagesApi.getLightboxList()
is nowimagesApi.getImageCollectionList()
imagesApi.getLightbox()
is nowimagesApi.getImageCollection()
imagesApi.renameLightbox()
is nowimagesApi.renameImageCollection()
imagesApi.deleteLightbox()
is nowimagesApi.deleteImageCollection()
imagesApi.addLightboxItems()
is nowimagesApi.addImageCollectionItems()
imagesApi.getLightboxItems()
is nowimagesApi.getImageCollectionItems()
imagesApi.deleteLightboxItems()
is nowimagesApi.deleteImageCollectionItems()
imagesApi.getFeaturedLightboxList()
is nowimagesApi.getFeaturedImageCollectionList()
imagesApi.getFeaturedLightbox()
is nowimagesApi.getFeaturedImageCollection()
imagesApi.getFeaturedLightboxItems()
is nowimagesApi.getFeaturedImageCollectionItems()
videosApi.createClipbox()
is nowvideosApi.createVideoCollection()
videosApi.getClipboxList()
is nowvideosApi.getVideoCollectionList()
videosApi.getClipbox()
is nowvideosApi.getVideoCollection()
videosApi.renameClipbox()
is nowvideosApi.renameVideoCollection()
videosApi.deleteClipbox()
is nowvideosApi.deleteVideoCollection()
videosApi.getVideoCategories()
is nowvideosApi.listVideoCategories()
videosApi.addClipboxItems()
is nowvideosApi.addVideoCollectionItems()
videosApi.getClipboxItems()
is nowvideosApi.getVideoCollectionItems()
videosApi.deleteClipboxItems()
is nowvideosApi.deleteVideoCollectionItems()
audioApi.searchAudio()
is nowaudioApi.searchTracks()
audioApi.getGenres()
is nowaudioApi.listGenres()
audioApi.getInstruments()
is nowaudioApi.listInstruments()
audioApi.getMoods()
is nowaudioApi.listMoods()
audioApi.getAudioLicenseList()
is nowaudioApi.getTrackLicenseList()
audioApi.createSoundbox()
is nowaudioApi.createTrackCollection()
audioApi.getSoundboxList()
is nowaudioApi.getTrackCollectionList()
audioApi.getSoundbox()
is nowaudioApi.getTrackCollection()
audioApi.renameSoundbox()
is nowaudioApi.renameTrackCollection()
audioApi.deleteSoundbox()
is nowaudioApi.deleteTrackCollection()
audioApi.addSoundboxItems()
is nowaudioApi.addTrackCollectionItems()
audioApi.getSoundboxItems()
is nowaudioApi.getTrackCollectionItems()
audioApi.deleteSoundboxItems()
is nowaudioApi.deleteTrackCollectionItems()
editorialApi.getEditorialImageCategories()
is noweditorialApi.listEditorialImageCategories()
editorialApi.getEditorialImageDetails()
is noweditorialApi.getEditorialImage()
editorialApi.getEditorialLivefeedImagesList()
is noweditorialApi.getEditorialImageLivefeedList()
editorialApi.getEditorialLivefeedImageItems()
is noweditorialApi.getEditorialImageLivefeedItems()
editorialApi.editorialVideosSearch()
is noweditorialApi.searchEditorialVideos()
editorialApi.getEditorialCategories()
is noweditorialApi.listEditorialVideoCategories()
editorialApi.editorialVideosDetails()
is noweditorialApi.getEditorialVideo()
customMusicApi.listInstruments()
is nowcustomMusicApi.listCustomInstruments()
customMusicApi.listDescriptors()
is nowcustomMusicApi.listCustomDescriptors()
usersApi.getUserSubsciptionList()
is nowusersApi.getUserSubscriptionList()
2021-04-21 (v1.0.37)
- Adds 3 new endpoints for Featured Video Collections:
2021-03-24 (v1.0.35)
- Adds 4 new languages to the API: Vietnamese (vi), Indonesian (id), Greek (el) and Romanian (ro).
2021-03-01 (v1.0.34)
- Adds custom music endpoints and documentation.
2021-02-05 (v1.0.33)
- Adds documentation for the
/v2/editorial/images/updated
endpoint.
2020-01-15 (v1.0.32)
- Adds
NOT
exclusion feature to thecontributor_country
filter in theGET /v2/images/search
endpoint.
2020-01-06 (v1.0.31)
- Audio licensing endpoint now supports sandbox mode.
2020-12-21 (v1.0.30)
- Deprecates
/v2/editorial/
endpoints and adds/v2/editorial/images/
and/v2/editorial/videos/
endpoints.
2020-12-21 (v1.0.29)
- Removes
enhanced
,sensitive
,NOT enhanced
, andNOT sensitive
options from thelicense
parameter in the following endpoints:GET /v2/images/search
,GET /v2/videos/search
,GET /v2/cv/similar/images
- Adds the
POST /v2/images/search/suggestions
endpoint to suggest search keywords from a block of text
2020-11-16 (v1.0.28)
- Adds
keyword_safe_search
parameter toGET /v2/images/search
andGET /v2/videos/search
endpoints.
2020-09-24 (v1.0.27)
- Adds
username
,start_date
, andend_date
filters toGET /v2/images/licenses
andGET /v2/videos/licenses
endpoints.
2020-08-31 (v1.0.26)
- Removes audio_standard and audio_enhanced from audio licensing options
- Makes
license
a required field for audio licensing requests
2020-08-28 (v1.0.25)
- Add the
GET /v2/images/search/suggestions
andGET /v2/videos/search/suggestions
endpoints to autocomplete search terms - Provide translated descriptions for assets; contact us for access
- Change the
people_ethnicity
parameter to an array to allow searching for multiple ethnicities
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 the
contributor_country
parameter to filter results down to a specified country.
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 :
- The API now uses no default
sort
parameter unless it is passed explicitly.
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:
- Update the allowed values for "moods" and "genre" queries to always have a space; for example, "Dance/Techno" becomes "Dance / Techno".
- Expose the "fields" parameter to allow specifying which fields to display in the response. Update required security for updated videos endpoint.
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.
- Old value was one of:
sd
,hd
,lowres
, ororiginal
. - New value is one of:
web
,sd
,hd
, or4k
.
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:
- Respond to asset details requests with 403 when asset is outside of accessible collections.
- Old behavior was to respond with 404.
- Affects:
GET /v2/images/{id}
GET /v2/videos/{id}
2019-02-05
Limit the use of the API for accounts that do not have an active or inactive paid subscription:
- Provide results from a limited media library, not the complete Shutterstock library.
- Limit responses to the first 100 results, regardless of how many are shown on a page.
- Allow no more than two search fields per search request, not including the
query
,page
,per_page
, andview
fields. - Allow only minimal view of responses, not full view.
- Disallow use of these endpoints:
GET /v2/images/{id}/similar
(List similar images)POST /v2/images
(upload images for reverse image search)GET /v2/images
(list images)- Licensing endpoints for all media types.
- Disallow use of editorial endpoints.
- Limit number of requests per hour.
2018-12-06
- The
purchases.view
scope is required for requests toPOST /v2/images/licenses
andPOST /v2/videos/licenses
.
2018-10-24
- Remove the
PUT /v2/{images,audio,videos}/collections/:id/items
endpoint- This route would replace all items in a collection with new items.
2018-08-08
- Deprecate these parameters in the
GET /v2/audio/search
endpoint:added_date
,added_date_start
,added_date_end
,album_title
,bpm
,duration
,lyrics
,safe
,similar_artists
,title
, andvocal_description
.
2018-07-27
- Deprecate the
composition_metadata
parameter in theGET /v2/audio/search
endpoint.