Add an Instagram feed to your website
Three ways to integrate, one account. Pick the one that fits your site — each takes a few minutes.
Quick start
- Create a free account. Sign up with your email address — no password, we send you a login link.
- Pick your integration. WordPress plugin, PHP widget or the JSON API. Your API token is in the dashboard.
- Embed the feed. The profile you ask for is fetched on the first request and then kept up to date automatically.
The Instagram account must be a Business or Creator account (free to switch in the Instagram app). Private and personal accounts can't be read.
WordPress
Install quqii – Social Media Feed Grid from the plugin directory, connect it to your account in the plugin's settings, then add a shortcode or the Social Media Feed block in the editor.
[quqii-feed instagram="quqii.official"]
Examples
# Swipeable slider with autoplay [quqii-feed instagram="quqii.official" layout="slider" autoplay="1"] # 4 columns, no gaps, square corners [quqii-feed instagram="quqii.official" columns="4" no-gap="1" no-radius="1"] # Only the images, 8 posts, captions on tap [quqii-feed instagram="quqii.official" profile="0" limit="8" caption="1" captionpos="overlay"] # Just the follower count, inline in a sentence [quqii-feed instagram="quqii.official" display="followers"]
Shortcode attributes
Only instagram is required. For every other attribute you can set a default in the plugin's settings; the attribute overrides it for one feed.
| Attribute | Values | Description |
|---|---|---|
instagram | username | The Instagram account to show. |
display | all (default), profile, grid, followers, instagram | What to show: everything, only the profile header, only the posts, only the follower count, or only a button to the profile. |
layout | grid (default), slider | A grid, or a swipeable slider. |
columns | 1–8 (default 3) | Columns of the grid, or visible slides of the slider. |
columns-mobile | number, e.g. 1.3 | Columns / visible slides on small screens. A fraction lets the next slide peek in. |
limit | number | Number of posts to show. |
profile | 0 | Hides the profile area (picture, name, followers). |
caption | 1 / 0 | Show post captions. |
captionpos | below, overlay | Captions below the image, or as a tap-to-reveal overlay. |
showlikes, followercount | 1 / 0 | Show or hide like counts and the follower count. |
linktoinstagram | 1 / 0 | Link images to the post on Instagram. |
inlinevideo | 1 / 0 | Play videos on your page in an overlay (default) instead of opening Instagram. |
no-gap, no-radius | 1 | No space between posts / square corners. |
autoplay, autoplay-interval | 1; seconds 1–30 | Slider only: advance by itself, and how fast (default 4.5 s). |
arrows, dots | 0 | Slider only: hide the arrows / the dot navigation. |
class | CSS class | An extra class on the feed's outer element, for your own styling. |
Works in every page builder that supports shortcodes (Elementor, Divi, WPBakery and others). In a theme template use <?php echo do_shortcode('[quqii-feed instagram="quqii.official"]'); ?>.
PHP widget
For any PHP website. One file, three steps: include the widget, fetch the profile from the API, render it. Download quqii-widget.php from your dashboard — your token is already filled into the example there.
<?php
require 'quqii-widget.php';
$token = 'YOUR_TOKEN';
$username = 'quqii.official';
$posts = 12; // how many posts you show
$response = @file_get_contents(
'https://feed.quqii.net/api.php?u=' . urlencode($username) . '&limit=' . $posts . '&token=' . $token
);
$profile = $response ? json_decode($response, true) : null;
?>
<div>
<?php quqii_render($profile, ['columns' => 4]); ?>
</div>
Options for quqii_render()
Named like the shortcode attributes. All are optional.
| Option | Description |
|---|---|
columns | 1–8 columns (default 3). |
columns-mobile | Columns on small screens (default: 2, then 1). |
display | all (default), profile, grid, followers or instagram. |
profile | 0 = posts only. |
limit | Show only the first N posts. To also fetch only N, add &limit=N to the API request. |
showlikes, followercount | 0 hides the like counts / the follower count. |
linktoinstagram | 1 or 0. |
no-gap, no-radius | 1 = no space between posts / square corners. |
class | An extra CSS class on the widget's outer element. |
Captions, the slider layout and playing videos in an overlay are available in the WordPress plugin only.
JSON API
Use the API from any language to build your own layout. Send your token as a header; every request counts as one API call.
curl -H "Authorization: Bearer YOUR_TOKEN" \
"https://feed.quqii.net/api.php?u=quqii.official&limit=12"
Request parameters
| Parameter | Description |
|---|---|
u | Required. The Instagram username (a profile URL or a leading @ works too). |
token | Your API token — better sent as the header Authorization: Bearer …, because query strings end up in server logs. |
limit | How many posts you want, 1–36 and never more than your plan allows (Free 12, Supporter 16, Starter 24, Pro 36, Agency 36). Ask only for what you show. |
page | Optional. The URL of the page that shows the feed — it appears next to the account in your dashboard. |
Response
{
"username": "quqii.official",
"fullName": "quqii",
"followersCount": 3800,
"profilePicUrlHD": "https://...",
"latestPosts": [
{
"id": "17900000000000000",
"type": "Image",
"shortCode": "AbC_123",
"url": "https://www.instagram.com/p/AbC_123/",
"displayUrl": "https://...",
"caption": "...",
"timestamp": "2026-10-12T10:43:00+0000",
"likesCount": 42,
"commentsCount": 3
}
]
}
| Field | Meaning |
|---|---|
username, fullName, biography, externalUrl | The profile's texts. |
followersCount, followsCount, postsCount | The profile's numbers. |
profilePicUrlHD | Profile picture. |
latestPosts | Newest first. Each post has id, type (Image, Video or Sidecar = carousel), shortCode, url (the post on Instagram), caption, timestamp (ISO 8601), displayUrl (the image — for a video its preview image) and likesCount / commentsCount (missing when the owner hides them). |
videoUrl | Only if Instagram provides a video file. For other accounts' videos it usually doesn't: show displayUrl as a preview and link to url. |
childPosts | The items of a carousel, each with type, displayUrl and, where available, videoUrl. |
Image and video URLs are Instagram's own and stop working after a few days. Always use a fresh response and don't store the URLs. The service refreshes each profile automatically, at the latest every three days.
Answers & errors
| HTTP | Body | Meaning |
|---|---|---|
| 200 | the profile | Data as above. |
| 202 | {"status":"queued"} | The profile is being fetched (first request, or its image links had expired). Try again in a few seconds. |
| 400 | invalid_username, missing_username | The username is missing or not a valid Instagram username. |
| 401 | missing_token, invalid_token | No token, or one that isn't valid (any more). |
| 404 | account_unavailable | The account can't be shown. With "reason": "not_professional" it is private or a personal account: its owner has to switch it to a free Creator or Business account in the Instagram app. |
| 429 | quota_exceeded | Your call limit is reached and this profile isn't loaded yet. Profiles already loaded keep working, without new posts. |
Limits
Each plan has a number of API calls per billing period and a maximum number of posts per feed — see Pricing. A billing period starts on the day you subscribe to a paid plan; with a free account it is the calendar month. Your dashboard shows the usage and when it starts over.
When the call limit is reached, feeds keep working with the posts that were already visible, and new posts are no longer shown until the next period starts (or you upgrade). You get an email at 80 % and 90 % of your limit.
Ready to start?
Create a free account and have your first feed on your site in a few minutes.
Start for free