Schedule multiple posts at once using batch operations, CSV imports, and content calendars.
Overview
Bulk scheduling allows you to:
Schedule a week or month of content in one script
Import posts from CSV or spreadsheets
Create content calendars with automated publishing
Batch update or delete multiple posts
Schedule Multiple Posts
JavaScript: Schedule a Week of Content
const PUBLORA_API_KEY = 'YOUR_API_KEY';const BASE_URL = 'https://api.publora.com/api/v1';const headers = { 'Content-Type': 'application/json', 'x-publora-key': PUBLORA_API_KEY};async function scheduleWeekOfContent(posts, platforms, startDate = new Date()) { const results = []; for (let i = 0; i < posts.length; i++) { // Schedule each post on a different day at 10 AM UTC const scheduledDate = new Date(startDate); scheduledDate.setDate(startDate.getDate() + i); scheduledDate.setUTCHours(10, 0, 0, 0); const response = await fetch(`${BASE_URL}/create-post`, { method: 'POST', headers, body: JSON.stringify({ content: posts[i].content, platforms, scheduledTime: scheduledDate.toISOString() }) }); const result = await response.json(); results.push({ day: i + 1, date: scheduledDate.toDateString(), postGroupId: result.postGroupId, success: response.ok }); console.log(`Day ${i + 1}: ${response.ok ? '✓' : '✗'} ${scheduledDate.toDateString()}`); // Small delay to avoid rate limits await new Promise(r => setTimeout(r, 200)); } return results;}// Example: 7 days of contentconst weeklyPosts = [ { content: 'Monday motivation: Start your week with intention!' }, { content: 'Tech tip Tuesday: Always version your APIs.' }, { content: 'Wednesday wisdom: Ship fast, iterate faster.' }, { content: 'Throwback Thursday: How we grew from 0 to 10K users.' }, { content: 'Feature Friday: Check out our new analytics dashboard!' }, { content: 'Saturday reading: Top 5 dev articles this week.' }, { content: 'Sunday reflection: What will you build next week?' }];scheduleWeekOfContent(weeklyPosts, ['twitter-123456', 'linkedin-ABC123']);
Python: Schedule a Month of Content
import requestsfrom datetime import datetime, timedeltaimport timePUBLORA_API_KEY = 'YOUR_API_KEY'BASE_URL = 'https://api.publora.com/api/v1'headers = { 'Content-Type': 'application/json', 'x-publora-key': PUBLORA_API_KEY}def schedule_month_of_content(posts, platforms, start_date=None): if start_date is None: start_date = datetime.utcnow() results = [] for i, post in enumerate(posts): scheduled_date = start_date + timedelta(days=i) scheduled_date = scheduled_date.replace(hour=10, minute=0, second=0, microsecond=0) response = requests.post( f'{BASE_URL}/create-post', headers=headers, json={ 'content': post['content'], 'platforms': platforms, 'scheduledTime': scheduled_date.isoformat() + 'Z' } ) result = { 'day': i + 1, 'date': scheduled_date.strftime('%Y-%m-%d'), 'success': response.ok } if response.ok: result['postGroupId'] = response.json()['postGroupId'] results.append(result) print(f"Day {i + 1}: {'✓' if response.ok else '✗'} {scheduled_date.strftime('%Y-%m-%d')}") time.sleep(0.2) # Rate limiting successful = sum(1 for r in results if r['success']) print(f"\nScheduled {successful}/{len(posts)} posts") return results# Example: Generate 30 days of contentmonthly_posts = [ {'content': f'Day {i+1} of our 30-day challenge! #30daychallenge'} for i in range(30)]schedule_month_of_content(monthly_posts, ['twitter-123456'])
Import from CSV
CSV Format
Create a CSV file with your content:
content,platforms,scheduled_time"Monday motivation: Start strong!",twitter-123456;linkedin-ABC123,2026-03-01T09:00:00Z"Check out our new feature!",twitter-123456,2026-03-01T14:00:00Z"Weekly roundup thread",twitter-123456,2026-03-02T10:00:00Z"LinkedIn deep dive post",linkedin-ABC123,2026-03-02T12:00:00Z"Behind the scenes",instagram-789012,2026-03-03T11:00:00Z
# List all draft postsresponse = requests.get( f'{BASE_URL}/list-posts', headers={'x-publora-key': PUBLORA_API_KEY}, params={'status': 'draft'})posts = response.json()['posts']draft_ids = [pg['postGroupId'] for pg in posts]print(f"Found {len(draft_ids)} drafts:", draft_ids)
Note: Post group IDs (postGroupId) are MongoDB ObjectIds (e.g., 6626a1f5e4b0c91a2d3f4567). The list-posts endpoint returns results in a posts array and supports the following query parameters:
Parameter
Type
Description
status
string
Filter by status: draft, scheduled, published, failed, partially_published
platform
string
Filter by platform (e.g., twitter, linkedin)
page
number
Page number (default: 1)
limit
number
Results per page (default: 20)
fromDate
string
Filter posts scheduled on or after this ISO 8601 date
toDate
string
Filter posts scheduled on or before this ISO 8601 date
sortBy
string
Field to sort by: createdAt, updatedAt, or scheduledTime
sortOrder
string
Sort direction: asc or desc
The response includes a pagination object alongside the posts array: