Importing from a CSV
One row, one post. Up to 50 rows per request, and each row is checked on its own.
The file
The first row holds the column names. Separate with commas and quote texts that contain commas or line breaks. The dashboard can download a template with your profile’s accounts.
content,accounts,schedule_time,timezone,media_urls,first_comment
"We open Monday, see you there!",acc_ig|acc_li,2026-11-02 09:00,Europe/Madrid,https://cdn.acme.com/store.jpg,#valencia
Idea for next week,acc_li,,,,Columns
| Column | What it holds |
|---|---|
content | The text. Required unless there are media_urls. |
accounts | Account ids separated by |. |
group | Or the name of an account group (added to accounts). |
schedule_time | 2026-11-02 09:00 with timezone, or an ISO date with offset. Empty: posts now. |
timezone | IANA timezone, for example Europe/Madrid. |
queue | true for the next queue slot. |
draft | true to save it as a draft. |
media_urls | https URLs separated by |. The type comes from the extension. |
first_comment | First comment on Instagram, Facebook, LinkedIn, Threads and YouTube. |
instagram_format, facebook_format | feed, reel or story. |
youtube_title, youtube_visibility, youtube_playlist | Title, public/unlisted/private and playlist id. |
tiktok_privacy | Required with TikTok accounts: public, friends, followers or private. |
pinterest_title, pinterest_link, pinterest_board | The Pin’s title, link and board. |
reddit_subreddit, reddit_title | Subreddit (without r/) and title. |
google_cta_type, google_cta_url | Google Business button and its link. |
Check, then import
With dryRun: true every row is checked and nothing is posted. Then send the same CSV without dryRun: valid rows are created and the rest come back with their error.
curl -X POST "https://api.usecrier.com/v1/posts/import" \
-H "Authorization: Bearer $CRIER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"csv": "content,accounts\nHello,acc_ig",
"dryRun": true
}'const res = await fetch('https://api.usecrier.com/v1/posts/import', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.CRIER_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"csv": "content,accounts\nHello,acc_ig",
"dryRun": true
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://api.usecrier.com/v1/posts/import",
headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},
json={
"csv": "content,accounts\nHello,acc_ig",
"dryRun": True
},
)
data = res.json()["data"]{
"data": {
"total": 2,
"valid": 1,
"invalid": 1,
"dryRun": true,
"unknownColumns": [],
"rows": [
{ "row": 1, "ok": true },
{ "row": 2, "ok": false, "error": "accounts: acc_old is not a connected account" }
]
}
}