Learn how to integrate Bolt.new AI with the Shutterstock API in 2025 using a clear, step-by-step guide for fast, seamless creative workflows.

Book a call with an Expert
Starting a new venture? Need to upgrade your web app? RapidDev builds application with your growth in mind.
To integrate Bolt.new with the Shutterstock API, you don’t connect “Bolt” itself to Shutterstock. Instead, you write standard backend code inside Bolt.new’s sandbox that calls the Shutterstock REST API using HTTPS with an OAuth 2.0 access token. In practice, you create a small backend route (Node.js/Express is typical in bolt.new), store your Shutterstock API credentials in environment variables, call Shutterstock’s image or video search endpoints, and return results to your UI. This is a normal API integration — bolt.new is simply the environment where you write and test the code.
You treat Shutterstock like any other external REST API. Shutterstock exposes a real, documented OAuth 2.0 + HTTPS API. Bolt.new can send requests to it as long as you include the correct authorization header. Your “integration” is simply writing backend code within Bolt.new that fetches data from Shutterstock and exposes it to your frontend.
Here is the exact flow a junior dev can follow:
This is the minimal working code you can drop into a Bolt.new backend file like server.js or inside your existing API router. This follows Shutterstock’s REAL documented endpoints.
import express from "express"
import fetch from "node-fetch"
const app = express()
// Backend route the frontend will call
app.get("/api/search-images", async (req, res) => {
try {
const query = req.query.q || "nature" // example search term
// 1. Get an OAuth access token from Shutterstock
const tokenResponse = await fetch("https://api.shutterstock.com/v2/oauth/access_token", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body:
`client_id=${process.env.SHUTTERSTOCK_CLIENT_ID}` +
`&client_secret=${process.env.SHUTTERSTOCK_CLIENT_SECRET}` +
`&grant_type=client_credentials`
})
const tokenData = await tokenResponse.json()
// 2. Call Shutterstock Image Search
const searchResponse = await fetch(
`https://api.shutterstock.com/v2/images/search?query=${encodeURIComponent(query)}`,
{
method: "GET",
headers: {
Authorization: `Bearer ${tokenData.access_token}`
}
}
)
const searchResults = await searchResponse.json()
res.json(searchResults)
} catch (err) {
console.error(err)
res.status(500).json({ error: "Shutterstock API error" })
}
})
export default app
Your frontend simply calls the backend route above:
// Example inside a React component
const fetchImages = async () => {
const res = await fetch(`/api/search-images?q=cats`)
const data = await res.json()
console.log(data)
}
Integration is simple: you create environment variables in Bolt.new, build a backend endpoint that obtains an OAuth token from Shutterstock, call their REST API, and pass results to your UI. Bolt.new doesn’t do anything “special”; it just runs your Node.js code that integrates with Shutterstock’s official API. This is production‑real, standards‑based, and works exactly like any external API integration.
When it comes to serving you, we sweat the little things. That’s why our work makes a big impact.