drafts.create
Store a Draft.
Prerequisites
- A Curviate API key, passed as
apiKeywhen you construct the client. Quickstart shows how to create one.
Signature
create(body: DraftCreateBody = {}): Promise<DraftCreateResult>Example
import { Curviate } from "@curviate/sdk";
const curviate = new Curviate({
apiKey: "cvt_live_...",
baseUrl: "https://api.curviate.com",
});
const draft = await curviate.drafts.create({
account_id: "acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8",
text: "Three things we learned shipping our first agent integration.",
scheduled_at: "2026-10-12T09:00:00+02:00",
});
// draft.status === "scheduled"Parameters
| Name | Type | Required | Description |
|---|---|---|---|
account_id | string | No | The account (acc_...) this Draft will publish as, or null for none yet. A Draft belongs to at most one account. |
scheduled_at | string | No | When Curviate publishes this Draft: an ISO 8601 date-time with an offset, at least 5 minutes and at most 365 days ahead, stored in UTC truncated to the minute. Scheduling needs an account and text. Curviate publishes it up to 20 seconds after this time, and keeps scheduled posts on one account at least 5 minutes apart. null unschedules. |
text | string | No | Post body text, up to 3000 characters. May be empty while drafting; publishing needs at least one character. |
quoted_post_id | string | No | A post to quote or repost when published, the same as on create post. Checked at publish time. |
can_read | string | No | Who can read the post once published. |
can_comment | string | No | Who may comment once published. |
post_as | string | No | Company page id to post as; the account must administer it. Checked at publish time. |
attachments | array | No | Media as base64 objects: up to 20 images, or one MP4 video, or one PDF, never mixed. 5 MiB per file inline. |
Returns
Resolves to DraftCreateResult. Top-level fields: object, id, account_id, status, text, attachments, quoted_post_id, can_read, can_comment, post_as, scheduled_at, failure, created_at, updated_at, safety_warning.
Error codes
| Code | What it means, and what to do |
|---|---|
UNAUTHORIZED | The API key is missing, malformed, or revoked. Check the key you passed to the client. |
INVALID_REQUEST | A parameter failed validation. The message names the offending field; fix the request rather than retrying it. |
RATE_LIMIT_ACCOUNT | This account's own quota is exhausted. Wait for the window in the Retry-After header, then retry. |
RATE_LIMIT_TENANT | The tenant-wide quota is exhausted across all accounts. Slow the whole workload, not just this call. |
PLATFORM_RATE_LIMIT | LinkedIn is throttling this account. Back off well beyond the hinted delay; sustained pressure risks the account. |
PLATFORM_ERROR | An upstream failure, usually transient: retry once with backoff before treating it as a real error. Check the response first, though. When it carries retry_likely_to_succeed: false and retry_hint: {kind: "never"}, retrying cannot help and backing off only delays the real answer. |
ACCOUNT_NOT_FOUND | No connected account with that id belongs to this tenant. List your accounts to get a current id. |
ACCOUNT_REQUIRED | Publishing or scheduling needs an account on the Draft (and account_id: null on a scheduled Draft is refused). Set account_id first, or unschedule before clearing it. |
DRAFT_LIMIT_REACHED | The bucket (one account, or Drafts with no account) already holds 50 Drafts. Delete one, or use another account; retrying unchanged will not help. |
DRAFT_NOT_PUBLISHABLE | The Draft has a content gap, such as empty text; the message names the field. Fix it, then publish or schedule again. |
MEDIA_QUOTA_EXCEEDED | The file would take the bucket past its media quota and nothing was stored. Delete media from other Drafts first. |
NO_ACTIVE_SEAT | The targeted account is not on an active seat. Buy or attach a seat in Billing, then retry. |
PAYLOAD_TOO_LARGE | A file is over its limit: 5 MiB per image or per file sent inline, 50 MiB for a video or PDF sent with uploadAttachment. Send a smaller file, or move a large one to uploadAttachment. |
RESOURCE_NOT_FOUND | The id in the path does not exist, or is not visible to this account. Re-read it from the list endpoint that produced it. |
SCHEDULE_CONFLICT | Another scheduled Draft on the same account is within 5 minutes of this scheduled_at; the message names it. Pick a time at least 5 minutes away. |
Every code above is a stable CurviateError.code you can branch on. The full list, the response envelope, and retry semantics are in the Error codes reference.
Next steps
drafts.list: List Drafts, cursor-paginated.drafts.get: Return one Draft, with a fresh signed link (valid 1 hour) per attachment.drafts.delete: Delete the Draft and its stored media (bodyless, 204).- SDK Quick Start: installation, the client, account scoping, and pagination.