TikTok growth
Watch a niche, find the videos doing far better than their creator’s usual, learn why, write your version or make it a photo carousel, post it and see where it landed. Every step below is also an MCP tool at https://mcp.postpeg.com/mcp.
Start from your website
POST/v1/tiktok/onboarding/suggest
Send a website or App Store link. postpeg reads it and proposes up to 2 niches with keywords and hashtags in the brand’s language, plus competitor accounts found on TikTok (creators who keep showing up in the top results, and named brands with at least 1,000 followers). Nothing is created until you create the niche. Limited to 3 suggestions a day.
curl https://api.postpeg.com/v1/tiktok/onboarding/suggest \
-H "Authorization: Bearer $POSTPEG_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example-coffee.com"
}'Niches
POST/v1/tiktok/niches
| Field | Description |
|---|---|
profile_idstring | The profile the niche belongs to. |
namestring | Your label, e.g. “Specialty coffee”. |
competitorshandles, up to 10 | TikTok accounts to watch. |
keywordsstrings, up to 3 | Searched on TikTok daily. |
hashtagsstrings, up to 3 | Followed daily. |
Sources are fetched right away, then refreshed daily. A source that fails or finds nothing shows up in the niche’s warnings. After a downgrade the oldest niches keep refreshing; the others pause with a warning, and nothing is deleted.
curl https://api.postpeg.com/v1/tiktok/niches \
-H "Authorization: Bearer $POSTPEG_KEY" \
-H "Content-Type: application/json" \
-d '{
"profile_id": "prf_main",
"name": "Specialty coffee",
"competitors": [
"smallbatchroaster"
],
"keywords": [
"pour over"
],
"hashtags": [
"pourover"
]
}'Top videos
GET/v1/tiktok/niches/{id}/top
The niche’s videos from the last days (default 7), ranked by outlier_score: views ÷ the creator’s median views. Filter with source (competitor, keyword, hashtag), up to limit 50. Why outlier score beats raw views: TikTok competitor analysis API.
slides is how many images a photo post has (null for a video). format says what kind of post it is (tutorial, list, talking_head…): from its breakdown when one is ready, otherwise read from its caption shortly after it starts beating its creator’s usual views; null until then.
curl https://api.postpeg.com/v1/tiktok/niches/nch_7h2k9q4m1x8v3c6b5n0z2w4r1/top?limit=5 \
-H "Authorization: Bearer $POSTPEG_KEY"Why it worked
POST/v1/tiktok/breakdowns
Send a video_id from the top list. The breakdown reads the transcript and caption: the hook from the first 3 seconds, hook_type, format, call_to_action, length and 2–4 reasons in why. It’s usually ready in seconds; poll GET /v1/tiktok/breakdowns/{id} while status is pending. A breakdown counts against your month only when it arrives, and one made in the last 30 days is shared at no cost.
{
"status": "ready",
"hook": {
"text": "Stop rinsing your paper filter with tap water.",
"seconds": 2.6,
"source": "speech"
},
"hook_type": "bold_claim",
"format": "tutorial",
"call_to_action": "comment",
"why": [
"Opens with a claim most viewers disagree with, so they stay to argue"
]
}Write your version
POST/v1/tiktok/scripts
Give a breakdown_id to write your version of that video, in the same format, hook type and length, or a topic to start from an idea. One of the two is required. Pass profile_id and the brand’s name, summary and language set the voice. The script comes back in a few seconds, with a caption you can send straight to POST /v1/posts.
| Field | Description |
|---|---|
breakdown_idstring | A breakdown of yours with status ready. Otherwise send topic. |
topicstring, 3–300 characters | What your video is about. Otherwise send breakdown_id. |
profile_idstring | Brand voice and language come from this profile’s brand. |
niche_idstring | Recorded on the script so you can list it with the niche. |
formatstring | talking_head, tutorial, list, before_after, skit, review, pov or other. Defaults to the breakdown’s. |
length_bucketstring | under_15s, 15_30s, 30_60s or over_60s. Defaults to the breakdown’s, else 15_30s. |
voicestring, up to 300 | How you sound, in your words: “dry, a bit sarcastic, no emojis”. |
languageISO 639-1 | Defaults to the brand’s language, then the breakdown’s, then English. |
curl https://api.postpeg.com/v1/tiktok/scripts \
-H "Authorization: Bearer $POSTPEG_KEY" \
-H "Content-Type: application/json" \
-d '{
"breakdown_id": "brk_2m6q9x4c8v1b5n3z7k0w2r4t6",
"profile_id": "prf_main",
"voice": "friendly, a little dry, no emojis"
}'{
"id": "scr_4d8w2n6p1k9x3v7b5c0z2m4r8",
"hook": "Stop rinsing your filter with the tap. Here is what to use instead.",
"beats": [
{
"text": "Show the cloudy cup you get when you rinse with tap water.",
"seconds": 5
},
{
"text": "Pour the same coffee after a rinse with the water you brew with.",
"seconds": 10
},
{
"text": "Taste both on camera and say what changed.",
"seconds": 8
}
],
"call_to_action": "Comment which water you use.",
"caption": "The filter rinse most people get wrong.",
"hashtags": [
"pourover",
"coffeetok"
],
"format": "tutorial",
"length_bucket": "15_30s",
"language": "en",
"breakdown_id": "brk_2m6q9x4c8v1b5n3z7k0w2r4t6",
"niche_id": null,
"profile_id": "prf_main",
"created_at": "2026-09-30T09:12:44.318Z"
}beats are what to say or show after the hook, in order; seconds is a suggested length for each. GET /v1/tiktok/scripts lists your recent scripts (newest first, limit up to 50) and GET /v1/tiktok/scripts/{id} returns one. Errors:
400 invalid_request: neitherbreakdown_idnortopic, or a field out of range.404 not_found: the breakdown, profile or niche isn’t yours.409 conflict: the breakdown is stillpendingor failed; write the script once it’s ready.402 limit_reached: the month’s scripts are used up.502 upstream_error: the model didn’t answer. Try again; a failed attempt isn’t counted.
A script counts against your month only when it is written. Nothing is posted: send the hook, beats and caption to yourself, record the video, then publish it below.
Carousels
POST/v1/tiktok/carousels
A TikTok photo carousel: an educational slideshow of 4 to 10 1080×1920 slides (a hook, the body, a call to action), with a caption and hashtags. Give a breakdown_id to make a version of that video’s angle and hook type, or a topic. The brand behind profile_id supplies the facts, and only those: no invented prices, results or claims.
The look comes from what people save on Pinterest for the niche: a style card with a palette, a mood and the kind of imagery, researched once a week per niche. Two backgrounds are generated with no words on them. postpeg then sets the text on top itself, so every word is exactly as written and can be edited, Arabic and other right-to-left languages run right to left, and the text stays clear of the parts of the screen TikTok covers (the caption at the bottom, the buttons on the right).
| Field | Description |
|---|---|
profile_idstring · required | The brand the carousel is about: its name, summary and language. |
breakdown_idstring | A breakdown of yours with status ready. Otherwise send topic. |
topicstring, 3–300 characters | What the carousel teaches. Otherwise send breakdown_id. |
niche_idstring | Whose Pinterest results set the look. Defaults to the profile’s first niche. |
slidesinteger, 4–10 | How many slides. Default 7. |
templatestring | How the words sit on the slide: bold (default), minimal or editorial. |
voicestring, up to 300 | How you sound, in your words. |
languageISO 639-1 | Defaults to the brand’s language, then the breakdown’s, then English. |
curl https://api.postpeg.com/v1/tiktok/carousels \
-H "Authorization: Bearer $POSTPEG_KEY" \
-H "Content-Type: application/json" \
-d '{
"profile_id": "prf_main",
"breakdown_id": "brk_2m6q9x4c8v1b5n3z7k0w2r4t6",
"slides": 5,
"template": "bold"
}'{
"id": "car_mg4q2x7k9a1b5c8d3e6f0h2j4",
"status": "pending",
"stage": "writing",
"backgrounds": [
{
"index": 0,
"image_url": null
},
{
"index": 1,
"image_url": null
}
],
"error": null,
"profile_id": "prf_main",
"niche_id": "nch_7h2k9q4m1x8v3c6b5n0z2w4r1",
"breakdown_id": "brk_2m6q9x4c8v1b5n3z7k0w2r4t6",
"topic": null,
"template": "bold",
"language": null,
"style": null,
"slides": [],
"caption": null,
"hashtags": [],
"regenerations_left": 1,
"media": [],
"created_at": "2026-09-30T09:20:03.512Z",
"updated_at": "2026-09-30T09:20:03.512Z"
}It takes about a minute. Poll GET /v1/tiktok/carousels/{id} every 15 to 20 seconds until status is ready or failed. A failed carousel carries the reason in error and isn’t counted.
curl https://api.postpeg.com/v1/tiktok/carousels/car_mg4q2x7k9a1b5c8d3e6f0h2j4 \
-H "Authorization: Bearer $POSTPEG_KEY"{
"id": "car_mg4q2x7k9a1b5c8d3e6f0h2j4",
"status": "ready",
"stage": null,
"backgrounds": [
{
"index": 0,
"image_url": "https://api.postpeg.com/media/med_mg4q3b8n2c6dbg0k1x5v9z3w7r0t.jpg"
},
{
"index": 1,
"image_url": "https://api.postpeg.com/media/med_mg4q3b8n2c6dbg1k1x5v9z3w7r0t.jpg"
}
],
"error": null,
"profile_id": "prf_main",
"niche_id": "nch_7h2k9q4m1x8v3c6b5n0z2w4r1",
"breakdown_id": "brk_2m6q9x4c8v1b5n3z7k0w2r4t6",
"topic": null,
"template": "bold",
"language": "en",
"style": {
"palette": [
"#F3EDE4",
"#C9A27E",
"#6B4F3A",
"#2F2A26"
],
"mood": "calm, slow morning",
"imagery": "soft natural-light photography, top-down",
"source": "pinterest"
},
"slides": [
{
"index": 0,
"role": "hook",
"text": "Stop rinsing your paper filter with tap water",
"background": 0,
"image_url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d0k1x5v9z3w7r0t.jpg"
},
{
"index": 1,
"role": "body",
"text": "Tap water leaves chlorine in the paper, and your first sip tastes of it",
"background": 1,
"image_url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d1k1x5v9z3w7r0t.jpg"
},
{
"index": 2,
"role": "body",
"text": "Rinse with the water you brew with, just off the boil",
"background": 1,
"image_url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d2k1x5v9z3w7r0t.jpg"
},
{
"index": 3,
"role": "body",
"text": "Pour the rinse water away before the coffee goes in",
"background": 1,
"image_url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d3k1x5v9z3w7r0t.jpg"
},
{
"index": 4,
"role": "cta",
"text": "Save this for your next pour over",
"background": 0,
"image_url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d4k1x5v9z3w7r0t.jpg"
}
],
"caption": "The filter rinse most people get wrong.",
"hashtags": [
"pourover",
"coffeetok",
"homebarista"
],
"regenerations_left": 1,
"media": [
{
"url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d0k1x5v9z3w7r0t.jpg",
"type": "image"
},
{
"url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d1k1x5v9z3w7r0t.jpg",
"type": "image"
},
{
"url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d2k1x5v9z3w7r0t.jpg",
"type": "image"
},
{
"url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d3k1x5v9z3w7r0t.jpg",
"type": "image"
},
{
"url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d4k1x5v9z3w7r0t.jpg",
"type": "image"
}
],
"created_at": "2026-09-30T09:20:03.512Z",
"updated_at": "2026-09-30T09:21:07.004Z"
}Each slide has its role, text, the background behind it (0 behind the first and last slides, 1 behind the middle ones) and its image_url, a JPEG. media lists the slides in order, ready for POST /v1/posts. style is null when the niche’s Pinterest results gave too little to go on; the brand and topic set the look instead. GET /v1/tiktok/carousels lists your recent carousels (newest first, limit up to 50).
Edit the words
PATCH/v1/tiktok/carousels/{id}
New text for some slides (by index, up to 220 characters each), a new caption or new hashtags (up to 8). Only the slides you changed are rendered again, in a few seconds, and they come back with new image_urls. Edits are free and unlimited.
curl -X PATCH https://api.postpeg.com/v1/tiktok/carousels/car_mg4q2x7k9a1b5c8d3e6f0h2j4 \
-H "Authorization: Bearer $POSTPEG_KEY" \
-H "Content-Type: application/json" \
-d '{
"slides": [
{
"index": 0,
"text": "You are rinsing your filter wrong"
}
],
"hashtags": [
"pourover",
"coffeetok",
"brewguide"
]
}'Paint a background again
POST/v1/tiktok/carousels/{id}/backgrounds/{index}/regenerate
A new picture for background 0 or 1, and every slide on it rendered again. It takes up to a minute. Each carousel includes 1 regeneration (regenerations_left); after that the call answers 402 limit_reached and text edits stay free. If the image model fails, the call answers 502 upstream_error and nothing is used up.
curl -X POST https://api.postpeg.com/v1/tiktok/carousels/car_mg4q2x7k9a1b5c8d3e6f0h2j4/backgrounds/1/regenerate \
-H "Authorization: Bearer $POSTPEG_KEY"Post it as a photo post
Send the carousel’s media to POST /v1/posts for a TikTok account, with the caption and hashtags as content. Images (never mixed with a video) make a TikTok photo post. TikTok fetches the images itself, and only from postpeg’s verified media address, so they must be a carousel’s slides or files uploaded to postpeg, as JPEG or WebP, up to 35 per post. The first line of content becomes the post’s title.
curl https://api.postpeg.com/v1/posts \
-H "Authorization: Bearer $POSTPEG_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "The filter rinse most people get wrong. #pourover #coffeetok #homebarista",
"media": [
{
"url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d0k1x5v9z3w7r0t.jpg",
"type": "image"
},
{
"url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d1k1x5v9z3w7r0t.jpg",
"type": "image"
},
{
"url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d2k1x5v9z3w7r0t.jpg",
"type": "image"
},
{
"url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d3k1x5v9z3w7r0t.jpg",
"type": "image"
},
{
"url": "https://api.postpeg.com/media/med_mg4q3b8n2c6d4k1x5v9z3w7r0t.jpg",
"type": "image"
}
],
"account_ids": [
"acc_mfz22d1q5w8e2r6t0y4u7i3o9s"
],
"inspired_by": "7429108866120059158",
"niche_id": "nch_7h2k9q4m1x8v3c6b5n0z2w4r1",
"platform_options": {
"tiktok": {
"privacy": "public"
}
}
}'Errors:
400 invalid_request: neitherbreakdown_idnortopic, a field out of range, or a slideindexthe carousel doesn’t have.404 not_found: the profile, niche, breakdown or carousel isn’t yours.409 conflict: the breakdown isn’t ready, or the carousel is stillpending(or failed) when you edit it or regenerate a background.402 limit_reached: the month’s carousels are used up (ones in progress count), or this carousel’s regeneration is used.502 upstream_error: a regeneration failed. Try again; nothing was used.
A carousel counts against your month only when it is ready. Nothing is posted until you send it to POST /v1/posts.
Find creators
POST/v1/tiktok/creator-searches
Micro-influencers for a campaign: creators who make videos in your niche, in the language your customers speak. TikTok is searched with the words native speakers use (in Arabic, Arabic script and everyday terms, not a translation). Each account found is read for its followers, the country it is registered in, its engagement rate, usual views and how often it posts, then scored 0 to 100 for how naturally it could promote your product. Brand and repost pages, people posting in another language and accounts quiet for two months are left out. You get up to 15 creators, best fit first.
Every creator read is checked before it takes a place on the list. First their numbers: usual views of at least 2% of their followers (below that the audience is dead or bought), engagement between 1% and 35%, and at least two videos a month. Then a judge reads their bio and captions: a person rather than a brand or repost page, on your niche, in your language and safe for a brand. Only confident answers reject; unsure ones go to a language model. A creator left out doesn’t use a place, so the list fills with ones that pass. checks shows what each one scored, and rejected counts the rest by reason.
| Field | Description |
|---|---|
productstring, 3–300 characters · required | What the campaign promotes, in a sentence. |
nichestring, 2–80 characters · required | Where to look, e.g. “healthy eating”. |
languageISO 639-1 · required | The language the creators’ videos are in. |
countriesarray of ISO 3166-1 alpha-2, up to 5 | Countries to reach; creators based there rank first. |
tiersarray | Follower bands: nano 1,000–10,000, micro 10,000–100,000, mid 100,000–500,000. Default ["micro"]. |
curl https://api.postpeg.com/v1/tiktok/creator-searches \
-H "Authorization: Bearer $POSTPEG_KEY" \
-H "Content-Type: application/json" \
-d '{
"product": "A calorie-tracking app for busy parents",
"niche": "healthy eating",
"language": "ar",
"countries": [
"SA",
"AE"
],
"tiers": [
"micro"
]
}'It answers 202 with status: "pending" and takes about a minute. While it runs, stage says what it is doing (planning, searching, vetting, scoring) and creators appear as they are read. Poll GET /v1/tiktok/creator-searches/{id} until it is ready or failed.
curl https://api.postpeg.com/v1/tiktok/creator-searches/crs_mh3k8q2x7v1b4n9c5z0w6r2t8 \
-H "Authorization: Bearer $POSTPEG_KEY"{
"id": "crs_mh3k8q2x7v1b4n9c5z0w6r2t8",
"status": "ready",
"error": null,
"stage": null,
"product": "A calorie-tracking app for busy parents",
"niche": "healthy eating",
"language": "ar",
"countries": [
"SA",
"AE"
],
"tiers": [
"micro"
],
"queries": [
"أكل صحي",
"تحضير وجبات",
"دايت",
"وصفات صحية سريعة"
],
"found": 63,
"creators": [
{
"handle": "example.mealprep",
"display_name": "Meal prep with Noura",
"avatar_url": null,
"url": "https://www.tiktok.com/@example.mealprep",
"bio": "وصفات صحية سريعة للعائلة",
"verified": false,
"followers": 48200,
"videos_count": 312,
"country": "SA",
"language": "ar",
"engagement_rate": 0.094,
"median_views": 21000,
"posts_per_week": 4.2,
"last_posted_at": "2026-09-30T18:04:00.000Z",
"fit": 92,
"why": "Weekly family meal prep with calorie counts; a tracking app fits her routine videos.",
"top_videos": [
{
"url": "https://www.tiktok.com/@example.mealprep/video/7559921043381357842",
"thumbnail_url": null,
"views": 84000,
"caption": "تحضير وجبات الأسبوع في ساعة"
}
],
"audience": {
"handle": "example.mealprep",
"countries": [
{
"country": "SA",
"name": "Saudi Arabia",
"share": 0.58
},
{
"country": "AE",
"name": "United Arab Emirates",
"share": 0.14
},
{
"country": "KW",
"name": "Kuwait",
"share": 0.09
}
],
"fetched_at": "2026-10-01T09:12:00.000Z"
},
"checks": {
"reach": 0.436,
"on_niche": 0.94,
"brand_safe": 0.98
}
}
],
"rejected": {
"off_niche": 4,
"not_a_creator": 2,
"low_quality": 2,
"inactive": 1
},
"created_at": "2026-10-01T09:10:00.000Z",
"updated_at": "2026-10-01T09:11:04.000Z"
}engagement_rate is the median of (likes + comments + shares) ÷ views over their recent videos, so one viral video doesn’t carry it: around 4–6% is usual on TikTok, 8% and up is strong. country is where the account is registered; where its viewers are is the audience below.
Where a creator’s viewers are
POST/v1/tiktok/creators/{handle}/audience
The countries a creator’s audience is in, largest share first. A creator you looked up before comes back free (and shows on your searches as audience); a new one uses one of the month’s audience lookups, unless TikTok has no data for them.
curl -X POST https://api.postpeg.com/v1/tiktok/creators/example.mealprep/audience \
-H "Authorization: Bearer $POSTPEG_KEY"{
"handle": "example.mealprep",
"countries": [
{
"country": "SA",
"name": "Saudi Arabia",
"share": 0.58
},
{
"country": "AE",
"name": "United Arab Emirates",
"share": 0.14
},
{
"country": "KW",
"name": "Kuwait",
"share": 0.09
}
],
"fetched_at": "2026-10-01T09:12:00.000Z"
}A search counts against your month only when it is ready; a failed one is free. At a limit either call answers 402 limit_reached.
Post your version
POST/v1/posts
Publish to a connected TikTok account as usual: one video, or a carousel’s slides as a photo post. Add inspired_by (the video id) and niche_id so the post is measured against that niche. See Publishing and the TikTok posting API for TikTok’s options.
Best times to post
GET/v1/tiktok/niches/{id}/best-times
When the niche’s over-performing videos of the last 30 days were posted, in the time zone you pass as timezone (an IANA name such as America/New_York; default UTC). It reads the niche, not your own account, so it works from the first refresh and needs no TikTok analytics access. It answers from stored data and never waits on TikTok.
curl https://api.postpeg.com/v1/tiktok/niches/nch_7h2k9q4m1x8v3c6b5n0z2w4r1/best-times?timezone=America/New_York \
-H "Authorization: Bearer $POSTPEG_KEY"{
"niche_id": "nch_7h2k9q4m1x8v3c6b5n0z2w4r1",
"timezone": "America/New_York",
"based_on": 84,
"low_data": false,
"best": [
{
"weekday": 2,
"hour": 19,
"score": 100
},
{
"weekday": 4,
"hour": 12,
"score": 91
},
{
"weekday": 0,
"hour": 9,
"score": 78
}
]
}Shortened: the real response also carries heatmap. best holds up to 5 slots, best first. weekday is 0 for Sunday to 6 for Saturday, hour is 0–23, and score is relative to the niche’s best slot (100). heatmap is 7 rows of 24 scores for drawing the week. based_on is how many videos the slots come from. Until there are about 30, low_data is true and the slots are a hint, not a rule; with none yet, best and heatmap are empty. An unknown time zone answers 400 invalid_request. Best times don’t count against any limit.
Benchmarks
GET/v1/posts/{id}/benchmark
At 24 hours and 7 days postpeg records the post’s views and says which percentile of the niche’s week it reached.
Weekly report
GET/v1/tiktok/niches/{id}/report
The week’s 5 best videos with their breakdowns, the formats and hooks they shared, your posts with their percentile, and one suggestion. The same report is emailed on Mondays; turn it off with PUT /v1/tiktok/report-settings or the link in the email.
Limits and usage
Trial: 1 niche, 3 competitors, 10 breakdowns, 10 scripts, 3 carousels, 1 creator search and 3 audience lookups. Starter ($29): 1 niche, 10 competitors each, 100 breakdowns, 100 scripts, 5 carousels, 4 creator searches and 15 audience lookups a month. Pro ($79): 5 niches, 10 competitors each, 500 breakdowns, 500 scripts, 20 carousels, 8 creator searches and 20 audience lookups a month. Scale ($199): 15 niches, 10 competitors each, 1,500 breakdowns, 1,500 scripts, 45 carousels, 12 creator searches and 22 audience lookups a month. All monthly limits reset on the 1st of the month (UTC).
GET/v1/tiktok/usage
What you have used against your plan this month.
curl https://api.postpeg.com/v1/tiktok/usage \
-H "Authorization: Bearer $POSTPEG_KEY"{
"niches": {
"used": 1,
"limit": 1
},
"breakdowns": {
"used": 12,
"in_progress": 0,
"limit": 100,
"resets_at": "2026-10-01T00:00:00.000Z"
},
"scripts": {
"used": 4,
"limit": 100,
"resets_at": "2026-10-01T00:00:00.000Z"
},
"carousels": {
"used": 2,
"in_progress": 1,
"limit": 5,
"resets_at": "2026-10-01T00:00:00.000Z"
},
"creator_searches": {
"used": 1,
"in_progress": 0,
"limit": 4,
"resets_at": "2026-10-01T00:00:00.000Z"
},
"audience_lookups": {
"used": 6,
"limit": 15,
"resets_at": "2026-10-01T00:00:00.000Z"
}
}For example, at the limit a script request answers:
{
"type": "https://postpeg.com/errors/limit_reached",
"title": "Plan limit reached",
"status": 402,
"detail": "Your plan includes 100 scripts a month and 100 are used; they reset on the 1st (UTC)",
"code": "limit_reached",
"request_id": "8f14e45f-ceea-467a-9575-1f2a5c3e6b0d"
}