Skip to content

LoopFeed API Reference

The LoopFeed API provides programmatic access to content aggregation and publishing features. This documentation covers all available endpoints for gettings all the projects for your organization, getting topics for a project, retrieving published content, and monitoring content counts.

  1. Get All Projects

    Get a list of available projects for your organization.

  2. Get All Topics for a Project

    Get a list of available topics for a project.

  3. Get Content Count for a Topic

    Get the number of published content items for a topic.

  4. Get Published Content for a Topic

    Retrieve the actual content items with filtering and pagination options for a topic.

All API requests are made to:

Base URL
https://q.loop-feed.com/v1/

/v1/projects/.. API requests require authentication. Use X-Api-Key header to pass your API key.

X-Api-Key: <api-key>

You can create the API key from LoopFeed dashboard. Navigate to “Settings” -> “API Keys” and click on “Create API Key”.

API Keys Dashboard

Generate the key with the default scopes and copy the key:

API Key Generation

Use this key in the X-Api-Key header for all the protected endpoints.

Get All Projects

Get a list of available projects for your organization.

GET /v1/projects

Get All Topics for a Project

Get a list of available topics for a project.

GET /v1/project/<project-id>/topics

Get Content Count for a Topic

Get the number of published content items for a topic.

GET /v1/topic/<topic-id>/count

Get Published Content for a Topic

Retrieve the actual content items with filtering and pagination options for a topic.

GET /v1/topic/<topic-id>/content

Get a list of all the projects for your organization. Projects are the top-level entities in LoopFeed and are used to group topics, widgets, queues etc.

GET https://q.loop-feed.com/v1/projects
HeaderTypeDescription
X-Api-KeyStringRequired: Your API key
[
{
"id":"id-of-the-project",
"name":"name-of-the-project"
},
]

Get a list of all the active topics for a specific project. Refer to the topic creation guide for more information on how to create and configure a topic.

GET https://q.loop-feed.com/v1/project/<project-id>/topics
HeaderTypeDescription
X-Api-KeyStringRequired: Your API key
ParameterTypeDescription
project-idStringRequired: ID of the project
[
{
"id":"id-of-the-topic",
"name":"name-of-the-topic",
"url":"https://q.loop-feed.com/v1/content/id-of-the-topic",
"metadata":null
}
]

Get the number of published content items for a topic.

GET https://q.loop-feed.com/v1/topic/<topic-id>/count
ParameterTypeDescription
topic-idStringRequired: ID of the topic
ParameterTypeDescription
serviceStringOptional: Filter by service (twitter, youtube, instagram, rss)
sinceIntegerOptional: Unix timestamp - content published after this time
untilIntegerOptional: Unix timestamp - content published until this time
limitIntegerOptional: Number of results (default: 20)
offsetIntegerOptional: Pagination offset (default: 0)
{
"count": 256
}

Retrieve published content items for a specific topic. This is the main endpoint for getting actual content data.

GET https://q.loop-feed.com/v1/topic/<topic-id>/content
ParameterTypeDescription
topic-idStringRequired: ID of the topic
ParameterTypeDescription
serviceStringOptional: Filter by service (twitter, youtube, instagram, rss)
sinceIntegerOptional: Unix timestamp - content published after this time
untilIntegerOptional: Unix timestamp - content published until this time
limitIntegerOptional: Number of results (default: 20)
offsetIntegerOptional: Pagination offset (default: 0)
[
{
"id": "6fc9c511ab95bbd83f8478437a2f87ff1fc4f365",
"service": "rss",
"type": "link",
"title": "Premier League fixture rescheduled",
"text": "Our forthcoming Premier League fixture against Burnley has been rescheduled",
"url": "https://www.arsenal.com/news/premier-league-fixture-rescheduled-0",
"date": "2022-01-09T17:10:00.000Z",
"author": {
"name": "arsenal",
"username": "arsenal"
},
"media": [
{
"type": "image",
"url": "https://www.arsenal.com/sites/default/files/styles/desktop_16x9/public/images/DSC_2115_2021050642150098.JPG?itok=-0Af-IiL"
}
],
"kudos": {
"score": 0,
"rss_score": 0
},
"language": "en"
}
]
PropertyTypeDescription
idStringUnique identifier for the content item
serviceStringSource platform (twitter, youtube, instagram, rss)
typeStringContent type (video, image, link, status, embed, comment)
titleStringContent title (may not be available for all content types)
textStringContent text/description (may contain HTML)
tagsArrayArray of content tags
urlStringURL to original content on source platform
dateDateTimePublication date in ISO 8601 format
authorObjectAuthor information with name and username
mediaArrayAttached media (images, videos, embeds)
kudosObjectEngagement metrics (likes, shares, etc.)
languageStringContent language (ISO 639-1 code)

Here’s a complete example showing the recommended workflow for efficiently working with the LoopFeed API:

// 1. Get all projects for your organization
const projectsResponse = await fetch('https://q.loop-feed.com/v1/projects', { headers: { 'X-Api-Key': 'your-api-key' } });
const projects = await projectsResponse.json();
// Choose a project from the list
const projectId = projects[0].id; // Choose your project from the previous step
// 2. Get all active topics for the project
const topicsResponse = await fetch(`https://q.loop-feed.com/v1/project/${projectId}/topics`, { headers: { 'X-Api-Key': 'your-api-key' } });
const topics = await topicsResponse.json();
// Ideally, we should store all the projects and topics in a database here for later use.
// You can have a cron job to fetch the projects and topics from the API.
// Choose a topic from the list
const topicId = topics[0].id; // Choose your topic from the previous step
// 3. Get content count for the topic
const countResponse = await fetch(`https://q.loop-feed.com/v1/topic/${topicId}/count`);
const countResult = await countResponse.json();
console.log('Content count for the topic:');
console.log(countResult.count);
// 4. Fetch new content for the topic
const contentResponse = await fetch(`https://q.loop-feed.com/v1/topic/${topicId}/content`);
const content = await contentResponse.json();
console.log('New content:');
content.forEach(item => {
console.log(`- ${item.service} ${item.type}: ${item.title}`);
});
// 5. Update your last fetch timestamp (recommended)
// You can store the last fetch timestamp in a database and use it to fetch only new content in subsequent requests.
// saveLastFetchTimestamp(Math.floor(Date.now() / 1000));
// Subsequennt requests should use the last fetch timestamp to fetch only new content.
// const contentResponse = await fetch(`https://q.loop-feed.com/v1/topic/${topicId}/content?since=${lastFetchTimestamp}`);
// const content = await contentResponse.json();
// console.log('New content:');
// content.forEach(item => {
// console.log(`- ${item.service} ${item.type}: ${item.title}`);
// });

For large result sets, use pagination:

async function fetchAllContent(topicId, since = null) {
let allContent = [];
let offset = 0;
const limit = 100; // Maximum per request
while (true) {
const response = await fetch(`https://q.loop-feed.com/v1/topic/${topicId}/content?limit=${limit}&offset=${offset}&since=${since}`);
const content = await response.json();
if (content.length === 0) break; // No more content
allContent.push(...content);
offset += limit;
// Break if we got less than the limit (last page)
if (content.length < limit) break;
}
return allContent;
}

Twitter

Brand Toolkit

Twitter Brand Guidelines →

  • Use official Twitter logo and colors
  • Include proper attribution
  • Link back to original tweets

YouTube

Developer Guidelines

YouTube Branding Guidelines →

  • Use official YouTube logo and play button
  • Include video attribution
  • Display accurate metadata

When displaying content, ensure:

  • ✅ Official logos are used correctly
  • ✅ Proper attribution is included
  • ✅ Links back to original content work
  • ✅ Brand colors match official guidelines
  • ✅ Required disclaimers are present
  • ✅ Terms of service are followed

  1. Check counts first: Always use the count endpoint to determine if new content is available
  2. Use timestamps: Leverage since parameters to fetch only new content
  3. Implement caching: Cache responses locally to reduce API calls
  4. Batch requests: Use maximum count values (100) to minimize request numbers
  5. Handle errors gracefully: Implement retry logic with exponential backoff