Docs

API reference

Base URL https://api.usecrier.com/v1. Every response is wrapped in data.

Workspace

Your workspace and who is calling.

GET/v1/me

Who is calling

Response 200

data
  • workspaceIdstringrequired
  • userobject | nullrequired

    Null when called with an API key.

    user
    • userIdstringrequired
    • emailstringoptional
  • rolestring | nullrequired

    The dashboard user’s role; null with an API key.

    Values: owner · admin · member

GET /v1/me
curl "https://api.usecrier.com/v1/me" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/workspace

Get the workspace

Response 200

data
  • idstringrequired
  • namestringrequired
  • usagestring | nullrequired

    Values: api · self

  • requireApprovalbooleanrequired

    Posts by members wait for an owner or admin to approve them.

  • createdAtstring (date-time)required
GET /v1/workspace
curl "https://api.usecrier.com/v1/workspace" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PATCH/v1/workspace

Update the workspace

Dashboard only

Body

  • namestringoptional

    max 100

  • usagestringoptional

    Values: api · self

  • requireApprovalbooleanoptional

    Posts by members wait for an owner or admin to approve them.

Response 200

data
  • idstringrequired
  • namestringrequired
  • usagestring | nullrequired

    Values: api · self

  • requireApprovalbooleanrequired

    Posts by members wait for an owner or admin to approve them.

  • createdAtstring (date-time)required
PATCH /v1/workspace
curl -X PATCH "https://api.usecrier.com/v1/workspace" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "usage": "api"
  }'

Team

Members and invitations. Owners and admins manage the team; members publish and answer.

GET/v1/team

List members and invitations

Response 200

data
  • membersobject[]required
    members
    • userIdstringrequired
    • emailstringoptional
    • rolestringrequired

      Values: owner · admin · member

    • joinedAtstring (date-time)required
    • youbooleanrequired
  • invitationsobject[]required
    invitations
    • idstringrequired
    • emailstringrequired
    • rolestringrequired

      Values: admin · member

    • createdAtstring (date-time)required
    • expiresAtstring (date-time)required
GET /v1/team
curl "https://api.usecrier.com/v1/team" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/team/invitations

Invite someone

Dashboard only

Returns a link to send to them. They join by signing in with the invited email.

Body

  • emailstring (email)required

    Who to invite; they must sign in with this email to accept.

  • rolestringoptional

    admin manages the team, API keys and webhooks; member publishes and answers.

    Values: admin · memberDefault: "member"

Response 201

data
  • invitationobjectrequired
    invitation
    • idstringrequired
    • emailstringrequired
    • rolestringrequired

      Values: admin · member

    • createdAtstring (date-time)required
    • expiresAtstring (date-time)required
  • urlstring (uri)required

    The link to send. Shown only now; valid for 7 days.

POST /v1/team/invitations
curl -X POST "https://api.usecrier.com/v1/team/invitations" \
  -H "Authorization: Bearer $CRIER_API_KEY"
DELETE/v1/team/invitations/{id}

Cancel an invitation

Dashboard only

Parameters

  • idstringrequired

Response 204

No content

DELETE /v1/team/invitations/key_2b4n6m
curl -X DELETE "https://api.usecrier.com/v1/team/invitations/key_2b4n6m" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PATCH/v1/team/members/{userId}

Change a role

Dashboard only

Parameters

  • userIdstringrequired

Body

  • rolestringrequired

    Values: admin · member

Response 200

data
  • userIdstringrequired
  • emailstringoptional
  • rolestringrequired

    Values: owner · admin · member

  • joinedAtstring (date-time)required
  • youbooleanrequired
PATCH /v1/team/members/{userId}
curl -X PATCH "https://api.usecrier.com/v1/team/members/{userId}" \
  -H "Authorization: Bearer $CRIER_API_KEY"
DELETE/v1/team/members/{userId}

Remove someone, or leave

Dashboard only

Parameters

  • userIdstringrequired

Response 204

No content

DELETE /v1/team/members/{userId}
curl -X DELETE "https://api.usecrier.com/v1/team/members/{userId}" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/invitations/accept

Accept an invitation

Dashboard only

Body

  • tokenstringrequired

    The token in the invitation link.

    min 16max 200

Response 200

data
  • workspaceIdstringrequired
  • rolestringrequired

    Values: owner · admin · member

POST /v1/invitations/accept
curl -X POST "https://api.usecrier.com/v1/invitations/accept" \
  -H "Authorization: Bearer $CRIER_API_KEY"

Profiles

A profile is one brand or end customer. Social accounts are connected to a profile.

GET/v1/profiles

List profiles

Response 200

data []
  • idstringrequired
  • namestringrequired
  • timezonestringoptional
  • externalIdstringoptional
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
GET /v1/profiles
curl "https://api.usecrier.com/v1/profiles" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/profiles

Create a profile

Body

  • namestringrequired

    Brand or end-customer name.

    max 100

  • timezonestringoptional

    IANA timezone, e.g. Europe/Madrid. Used by the queue.

    max 64

  • externalIdstringoptional

    Your own id for this customer, returned as is.

    max 200

Response 201

data
  • idstringrequired
  • namestringrequired
  • timezonestringoptional
  • externalIdstringoptional
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
POST /v1/profiles
curl -X POST "https://api.usecrier.com/v1/profiles" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme",
    "timezone": "Europe/Madrid",
    "externalId": "customer-42"
  }'
GET/v1/profiles/{id}

Get a profile

Parameters

  • idstringrequired

Response 200

data
  • idstringrequired
  • namestringrequired
  • timezonestringoptional
  • externalIdstringoptional
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
GET /v1/profiles/prf_8f2k4d
curl "https://api.usecrier.com/v1/profiles/prf_8f2k4d" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PATCH/v1/profiles/{id}

Update a profile

Parameters

  • idstringrequired

Body

  • namestringoptional

    Brand or end-customer name.

    max 100

  • timezonestringoptional

    IANA timezone, e.g. Europe/Madrid. Used by the queue.

    max 64

  • externalIdstringoptional

    Your own id for this customer, returned as is.

    max 200

Response 200

data
  • idstringrequired
  • namestringrequired
  • timezonestringoptional
  • externalIdstringoptional
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
PATCH /v1/profiles/prf_8f2k4d
curl -X PATCH "https://api.usecrier.com/v1/profiles/prf_8f2k4d" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme Spain"
  }'
DELETE/v1/profiles/{id}

Delete a profile

Also disconnects its accounts.

Parameters

  • idstringrequired

Response 204

No content

DELETE /v1/profiles/prf_8f2k4d
curl -X DELETE "https://api.usecrier.com/v1/profiles/prf_8f2k4d" \
  -H "Authorization: Bearer $CRIER_API_KEY"

Queue

Recurring weekly slots per profile. Posts sent with queue: true take the next free one.

GET/v1/profiles/{id}/queue

Get a profile's queue

Parameters

  • idstringrequired

Response 200

data
  • timezonestringrequired
  • slotsobject[]required
    slots
    • dayOfWeekintegerrequired

      0 = Sunday … 6 = Saturday

      max 9,007,199,254,740,991

    • timestringrequired

      HH:mm

  • nextSlotsstring (date-time)[]required

    The next free slots, soonest first.

GET /v1/profiles/prf_8f2k4d/queue
curl "https://api.usecrier.com/v1/profiles/prf_8f2k4d/queue" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PUT/v1/profiles/{id}/queue

Set the queue slots

Replaces every slot. Days go from 0 (Sunday) to 6 (Saturday); times are HH:mm in the queue timezone.

Parameters

  • idstringrequired

Body

  • timezonestringoptional

    max 64

  • slotsobject[]required

    max 100 items

    slots
    • dayOfWeekintegerrequired

      max 6

    • timestringrequired

Response 200

data
  • timezonestringrequired
  • slotsobject[]required
    slots
    • dayOfWeekintegerrequired

      0 = Sunday … 6 = Saturday

      max 9,007,199,254,740,991

    • timestringrequired

      HH:mm

  • nextSlotsstring (date-time)[]required

    The next free slots, soonest first.

PUT /v1/profiles/prf_8f2k4d/queue
curl -X PUT "https://api.usecrier.com/v1/profiles/prf_8f2k4d/queue" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "timezone": "Europe/Madrid",
    "slots": [
      {
        "dayOfWeek": 1,
        "time": "09:00"
      },
      {
        "dayOfWeek": 4,
        "time": "18:00"
      }
    ]
  }'
DELETE/v1/profiles/{id}/queue

Delete the queue

Parameters

  • idstringrequired

Response 204

No content

DELETE /v1/profiles/prf_8f2k4d/queue
curl -X DELETE "https://api.usecrier.com/v1/profiles/prf_8f2k4d/queue" \
  -H "Authorization: Bearer $CRIER_API_KEY"

Connect

Connect a social account: send the user to the URL, Crier brings them back to your redirectUrl.

GET/v1/connect/{platform}

Start connecting an account

Returns the URL to send the user to. When they finish, Crier redirects to redirectUrl with connected=<platform>&accountId=…, with error=… if it failed, or with select=<sessionId> when the user must pick a page, organization, board, location or profile (Facebook, LinkedIn, Pinterest, Google Business, Snapchat). In that case list the options and select one.

Parameters

  • platformstringrequired
  • profileIdstringrequired

    The profile the account will belong to.

  • redirectUrlstring (uri)required

    Where Crier sends the user back when the connection finishes.

Response 200

data
  • urlstring (uri)required

    Send the user here to authorize the network.

GET /v1/connect/instagram
curl "https://api.usecrier.com/v1/connect/instagram?profileId=prf_8f2k4d&redirectUrl=https%3A%2F%2Fapp.acme.com%2Fconnected" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/connect/sessions/{id}/options

List what the user can pick

The id is the select value Crier added to your redirectUrl. Sessions expire after one hour.

Parameters

  • idstringrequired

Response 200

data
  • platformstringrequired
  • optionsobject[]required
    options
    • idstringrequired
    • namestringrequired
    • detailstringoptional
    • imageUrlstring (uri)optional
GET /v1/connect/sessions/cs_5t2y8u/options
curl "https://api.usecrier.com/v1/connect/sessions/cs_5t2y8u/options" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/connect/sessions/{id}/select

Pick an option and finish connecting

Parameters

  • idstringrequired

Body

  • optionIdstringrequired

    max 200

Response 201

data
  • idstringrequired
  • profileIdstringrequired
  • platformstringrequired
  • usernamestringoptional
  • displayNamestringoptional
  • avatarUrlstring (uri)optional
  • statusstringrequired

    Values: active · needs_reconnection · disconnected

  • connectedAtstring (date-time)required
  • updatedAtstring (date-time)required
POST /v1/connect/sessions/cs_5t2y8u/select
curl -X POST "https://api.usecrier.com/v1/connect/sessions/cs_5t2y8u/select" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "optionId": "1042…"
  }'

Accounts

Connected social accounts, whether they can post, and their boards, playlists and subreddits.

GET/v1/accounts

List connected accounts

Parameters

  • profileIdstringoptional

Response 200

data []
  • idstringrequired
  • profileIdstringrequired
  • platformstringrequired
  • usernamestringoptional
  • displayNamestringoptional
  • avatarUrlstring (uri)optional
  • statusstringrequired

    Values: active · needs_reconnection · disconnected

  • connectedAtstring (date-time)required
  • updatedAtstring (date-time)required
GET /v1/accounts
curl "https://api.usecrier.com/v1/accounts?profileId=prf_8f2k4d" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/accounts/health

Check whether accounts can post

Asks each network right now. Accounts that need reconnecting are updated to needs_reconnection.

Parameters

  • profileIdstringrequired

Response 200

data []
  • accountIdstringrequired
  • platformstringrequired
  • statusstringrequired

    Values: healthy · warning · error

  • canPostbooleanrequired
  • needsReconnectionbooleanrequired
  • issuesstring[]required
GET /v1/accounts/health
curl "https://api.usecrier.com/v1/accounts/health?profileId=prf_8f2k4d" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/accounts/{id}/{kind}

List boards, playlists, subreddits or flairs

kind is pinterest-boards, youtube-playlists, reddit-subreddits or reddit-flairs (with subreddit). Use the ids in the post options.

Parameters

  • idstringrequired
  • kindstringrequired

    Values: pinterest-boards · youtube-playlists · reddit-subreddits · reddit-flairs

  • subredditstringoptional

    Required for reddit-flairs.

Response 200

data []
  • idstringrequired

    Send it as boardId, playlistId, subreddit or flairId.

  • namestringrequired
  • detailstringoptional
  • isDefaultbooleanoptional

    The account's default, used when a post does not pick one.

GET /v1/accounts/acc_3k9x2m/{kind}
curl "https://api.usecrier.com/v1/accounts/acc_3k9x2m/{kind}" \
  -H "Authorization: Bearer $CRIER_API_KEY"
DELETE/v1/accounts/{id}

Disconnect an account

Parameters

  • idstringrequired

Response 204

No content

DELETE /v1/accounts/acc_3k9x2m
curl -X DELETE "https://api.usecrier.com/v1/accounts/acc_3k9x2m" \
  -H "Authorization: Bearer $CRIER_API_KEY"

Account groups

Saved selections of accounts, to post to them together.

GET/v1/account-groups

List groups

Response 200

data []
  • idstringrequired
  • namestringrequired
  • accountIdsstring[]required
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
GET /v1/account-groups
curl "https://api.usecrier.com/v1/account-groups" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/account-groups

Create a group

Body

  • namestringrequired

    Unique within the workspace.

    max 60

  • accountIdsstring[]required

    Accounts of any profile.

    max 100 items

Response 201

data
  • idstringrequired
  • namestringrequired
  • accountIdsstring[]required
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
POST /v1/account-groups
curl -X POST "https://api.usecrier.com/v1/account-groups" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PATCH/v1/account-groups/{id}

Update a group

Parameters

  • idstringrequired

Body

  • namestringoptional

    Unique within the workspace.

    max 60

  • accountIdsstring[]optional

    Accounts of any profile.

    max 100 items

Response 200

data
  • idstringrequired
  • namestringrequired
  • accountIdsstring[]required
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
PATCH /v1/account-groups/key_2b4n6m
curl -X PATCH "https://api.usecrier.com/v1/account-groups/key_2b4n6m" \
  -H "Authorization: Bearer $CRIER_API_KEY"
DELETE/v1/account-groups/{id}

Delete a group

Parameters

  • idstringrequired

Response 204

No content

DELETE /v1/account-groups/key_2b4n6m
curl -X DELETE "https://api.usecrier.com/v1/account-groups/key_2b4n6m" \
  -H "Authorization: Bearer $CRIER_API_KEY"

Posts

Publish now, schedule, queue or save drafts to one or many accounts.

POST/v1/posts

Create a post

Publishes now unless you send scheduledFor, queue: true or draft: true. Each target is one account and can carry its own text, media and network options (instagram, youtube, tiktok…). TikTok targets always need tiktok options.

Body

  • contentstringrequired

    Text posted to every target that has no content of its own.

    max 10,000

  • mediaobject[]optional

    Images, videos or documents. Upload them first with POST /v1/media/upload-url.

    max 35 items

    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required

    max 50 items

    targets
    • accountIdstringrequired

      A connected account (GET /v1/accounts).

    • contentstringoptional

      Replaces the post text on this network.

      max 10,000

    • mediaobject[]optional

      max 35 items

      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • youtubeobjectoptional
      youtube
      • titlestringoptional

        Video title (up to 100 characters).

        max 100

      • visibilitystringoptional

        public, unlisted or private.

        Values: public · unlisted · private

      • madeForKidsbooleanoptional

        COPPA flag. YouTube may limit videos that do not set it.

      • categoryIdstringoptional

        Numeric YouTube category id.

      • playlistIdstringoptional

        Add it to this playlist.

        max 100

      • tagsstring[]optional

        Tags (500 characters in total).

        max 50 items

      • firstCommentstringoptional

        Comment posted right after.

        max 10,000

      • thumbnailUrlstring (uri)optional

        Custom thumbnail.

      • containsSyntheticMediabooleanoptional

        Contains realistic AI-generated or altered content.

      • notifySubscribersbooleanoptional

        false uploads it without notifying subscribers.

    • tiktokobjectoptional
      tiktok
      • privacystringrequired

        Who sees it: public, friends, followers or private.

        Values: public · friends · followers · private

      • allowCommentsbooleanrequired

        Allow comments.

      • allowDuetbooleanoptional

        Allow duets.

        Default: false

      • allowStitchbooleanoptional

        Allow stitches.

        Default: false

      • commercialContentstringoptional

        own_brand when it promotes your business, paid_partnership when sponsored. Not with private privacy.

        Values: own_brand · paid_partnership

      • autoAddMusicbooleanoptional

        Photos only: TikTok may add recommended music.

      • consenttruerequired

        Always true: the user saw the preview and agreed to post.

    • instagramobjectoptional
      instagram
      • formatstringoptional

        feed, reel or story. By default images go to the feed and a video is a Reel.

        Values: feed · reel · story

      • shareToFeedbooleanoptional

        Reels only: false keeps it out of the profile grid.

      • collaboratorsstring[]optional

        Up to 3 business or creator usernames invited as collaborators. Not for Stories.

        max 3 items

      • firstCommentstringoptional

        Comment posted right after. Not for Stories.

        max 2,200

      • coverUrlstring (uri)optional

        Reels only: cover image.

    • facebookobjectoptional
      facebook
      • formatstringoptional

        feed, reel or story.

        Values: feed · reel · story

      • reelTitlestringoptional

        Reels only: a title separate from the text.

        max 255

      • firstCommentstringoptional

        Comment posted right after. Not for Stories.

        max 10,000

    • linkedinobjectoptional
      linkedin
      • firstCommentstringoptional

        Comment posted right after.

        max 10,000

      • disableLinkPreviewbooleanoptional

        Hide the link preview.

      • documentTitlestringoptional

        Title of document (PDF) posts.

        max 400

    • xobjectoptional
      x
      • threadstring[]optional

        Thread replies, in order. The post’s text is the first tweet.

        max 25 items

      • replySettingsstringoptional

        Who can reply: following, mentionedUsers, subscribers or verified.

        Values: following · mentionedUsers · subscribers · verified

    • threadsobjectoptional
      threads
      • threadstring[]optional

        Thread replies, in order.

        max 25 items

      • topicTagstringoptional

        Topic of the post.

        max 50

      • firstCommentstringoptional

        Comment posted right after.

        max 10,000

    • blueskyobjectoptional
      bluesky
      • threadstring[]optional

        Thread replies, in order.

        max 25 items

    • pinterestobjectoptional
      pinterest
      • titlestringoptional

        Pin title.

        max 100

      • linkstring (uri)optional

        Where the Pin leads.

      • boardIdstringoptional

        Board. Defaults to the one picked when connecting.

        max 100

    • googleBusinessobjectoptional
      googleBusiness
      • callToActionobjectoptional

        The post’s button.

        callToAction
        • typestringrequired

          learn_more, book, order, shop, sign_up or call.

          Values: learn_more · book · order · shop · sign_up · call

        • urlstring (uri)optional

          Where the button leads. Required except for call.

    • telegramobjectoptional
      telegram
      • parseModestringoptional

        Text format: html or markdown.

        Values: html · markdown

      • disableLinkPreviewbooleanoptional

        Hide the link preview.

      • silentbooleanoptional

        Send without sound.

      • protectContentbooleanoptional

        Prevent forwarding or saving it.

    • snapchatobjectoptional
      snapchat
      • formatstringoptional

        story (gone after 24 h), saved_story (stays on the profile) or spotlight.

        Values: story · saved_story · spotlight

    • redditobjectoptional
      reddit
      • subredditstringoptional

        Subreddit without r/.

      • titlestringoptional

        Post title.

        max 300

      • linkstring (uri)optional

        Makes it a link post.

      • flairIdstringoptional

        Subreddit flair.

        max 100

      • nsfwbooleanoptional

        Mark it NSFW.

      • spoilerbooleanoptional

        Mark it as a spoiler.

  • scheduledForstring (date-time)optional

    When to publish (ISO 8601 with offset). Omit to publish now.

  • timezonestringoptional

    IANA timezone that scheduledFor refers to.

    max 64

  • queuebooleanoptional

    Take the next free slot of the profile's queue.

  • draftbooleanoptional

    Save without publishing or scheduling.

  • requiresApprovalbooleanoptional

    Hold it as pending_approval until an owner or admin approves it. Members of a workspace that requires approval always get it.

Response 201

data
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
POST /v1/posts
curl -X POST "https://api.usecrier.com/v1/posts" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Our autumn collection is here 🍂",
    "media": [
      {
        "type": "image",
        "url": "https://cdn.acme.com/autumn.jpg"
      }
    ],
    "targets": [
      {
        "accountId": "acc_3k9x2m"
      },
      {
        "accountId": "acc_9z8y7x",
        "youtube": {
          "title": "Autumn collection"
        }
      }
    ],
    "scheduledFor": "2026-10-30T09:00:00+01:00"
  }'
GET/v1/posts

List posts

Newest first.

Parameters

  • limitintegeroptional

    max 100

Response 200

data []
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
GET /v1/posts
curl "https://api.usecrier.com/v1/posts?limit=20" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/posts/import

Import posts from a CSV

One post per row, up to 50 rows. Columns: content, accounts (ids separated by |) or group, schedule_time, timezone, queue, draft, media_urls and per-network columns (see the CSV import guide). Send dryRun: true first to check every row without posting.

Body

  • csvstringrequired

    The CSV text, header row first.

    max 1,000,000

  • dryRunbooleanoptional

    Check every row without posting.

Response 200

data
  • totalintegerrequired

    max 9,007,199,254,740,991

  • validintegerrequired

    max 9,007,199,254,740,991

  • invalidintegerrequired

    max 9,007,199,254,740,991

  • dryRunbooleanrequired
  • unknownColumnsstring[]required

    Columns that were ignored.

  • rowsobject[]required
    rows
    • rowintegerrequired

      1-based, header excluded.

      max 9,007,199,254,740,991

    • okbooleanrequired
    • postIdstringoptional
    • errorstringoptional
POST /v1/posts/import
curl -X POST "https://api.usecrier.com/v1/posts/import" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PATCH/v1/posts/{id}

Change a post that is not live

Drafts, scheduled, failed and cancelled posts. Fields you leave out keep their value; targets replaces the whole list. draft: false publishes a draft now, or at scheduledFor, or in the queue.

Parameters

  • idstringrequired

Body

  • contentstringoptional

    Text posted to every target that has no content of its own.

    max 10,000

  • mediaobject[]optional

    Images, videos or documents. Upload them first with POST /v1/media/upload-url.

    max 35 items

    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]optional

    max 50 items

    targets
    • accountIdstringrequired

      A connected account (GET /v1/accounts).

    • contentstringoptional

      Replaces the post text on this network.

      max 10,000

    • mediaobject[]optional

      max 35 items

      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • youtubeobjectoptional
      youtube
      • titlestringoptional

        Video title (up to 100 characters).

        max 100

      • visibilitystringoptional

        public, unlisted or private.

        Values: public · unlisted · private

      • madeForKidsbooleanoptional

        COPPA flag. YouTube may limit videos that do not set it.

      • categoryIdstringoptional

        Numeric YouTube category id.

      • playlistIdstringoptional

        Add it to this playlist.

        max 100

      • tagsstring[]optional

        Tags (500 characters in total).

        max 50 items

      • firstCommentstringoptional

        Comment posted right after.

        max 10,000

      • thumbnailUrlstring (uri)optional

        Custom thumbnail.

      • containsSyntheticMediabooleanoptional

        Contains realistic AI-generated or altered content.

      • notifySubscribersbooleanoptional

        false uploads it without notifying subscribers.

    • tiktokobjectoptional
      tiktok
      • privacystringrequired

        Who sees it: public, friends, followers or private.

        Values: public · friends · followers · private

      • allowCommentsbooleanrequired

        Allow comments.

      • allowDuetbooleanoptional

        Allow duets.

        Default: false

      • allowStitchbooleanoptional

        Allow stitches.

        Default: false

      • commercialContentstringoptional

        own_brand when it promotes your business, paid_partnership when sponsored. Not with private privacy.

        Values: own_brand · paid_partnership

      • autoAddMusicbooleanoptional

        Photos only: TikTok may add recommended music.

      • consenttruerequired

        Always true: the user saw the preview and agreed to post.

    • instagramobjectoptional
      instagram
      • formatstringoptional

        feed, reel or story. By default images go to the feed and a video is a Reel.

        Values: feed · reel · story

      • shareToFeedbooleanoptional

        Reels only: false keeps it out of the profile grid.

      • collaboratorsstring[]optional

        Up to 3 business or creator usernames invited as collaborators. Not for Stories.

        max 3 items

      • firstCommentstringoptional

        Comment posted right after. Not for Stories.

        max 2,200

      • coverUrlstring (uri)optional

        Reels only: cover image.

    • facebookobjectoptional
      facebook
      • formatstringoptional

        feed, reel or story.

        Values: feed · reel · story

      • reelTitlestringoptional

        Reels only: a title separate from the text.

        max 255

      • firstCommentstringoptional

        Comment posted right after. Not for Stories.

        max 10,000

    • linkedinobjectoptional
      linkedin
      • firstCommentstringoptional

        Comment posted right after.

        max 10,000

      • disableLinkPreviewbooleanoptional

        Hide the link preview.

      • documentTitlestringoptional

        Title of document (PDF) posts.

        max 400

    • xobjectoptional
      x
      • threadstring[]optional

        Thread replies, in order. The post’s text is the first tweet.

        max 25 items

      • replySettingsstringoptional

        Who can reply: following, mentionedUsers, subscribers or verified.

        Values: following · mentionedUsers · subscribers · verified

    • threadsobjectoptional
      threads
      • threadstring[]optional

        Thread replies, in order.

        max 25 items

      • topicTagstringoptional

        Topic of the post.

        max 50

      • firstCommentstringoptional

        Comment posted right after.

        max 10,000

    • blueskyobjectoptional
      bluesky
      • threadstring[]optional

        Thread replies, in order.

        max 25 items

    • pinterestobjectoptional
      pinterest
      • titlestringoptional

        Pin title.

        max 100

      • linkstring (uri)optional

        Where the Pin leads.

      • boardIdstringoptional

        Board. Defaults to the one picked when connecting.

        max 100

    • googleBusinessobjectoptional
      googleBusiness
      • callToActionobjectoptional

        The post’s button.

        callToAction
        • typestringrequired

          learn_more, book, order, shop, sign_up or call.

          Values: learn_more · book · order · shop · sign_up · call

        • urlstring (uri)optional

          Where the button leads. Required except for call.

    • telegramobjectoptional
      telegram
      • parseModestringoptional

        Text format: html or markdown.

        Values: html · markdown

      • disableLinkPreviewbooleanoptional

        Hide the link preview.

      • silentbooleanoptional

        Send without sound.

      • protectContentbooleanoptional

        Prevent forwarding or saving it.

    • snapchatobjectoptional
      snapchat
      • formatstringoptional

        story (gone after 24 h), saved_story (stays on the profile) or spotlight.

        Values: story · saved_story · spotlight

    • redditobjectoptional
      reddit
      • subredditstringoptional

        Subreddit without r/.

      • titlestringoptional

        Post title.

        max 300

      • linkstring (uri)optional

        Makes it a link post.

      • flairIdstringoptional

        Subreddit flair.

        max 100

      • nsfwbooleanoptional

        Mark it NSFW.

      • spoilerbooleanoptional

        Mark it as a spoiler.

  • scheduledForstring (date-time)optional

    When to publish (ISO 8601 with offset). Omit to publish now.

  • timezonestringoptional

    IANA timezone that scheduledFor refers to.

    max 64

  • queuebooleanoptional

    Take the next free slot of the profile's queue.

  • draftbooleanoptional

    Save without publishing or scheduling.

  • requiresApprovalbooleanoptional

    Hold it as pending_approval until an owner or admin approves it. Members of a workspace that requires approval always get it.

Response 200

data
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
PATCH /v1/posts/pst_7q1w0e
curl -X PATCH "https://api.usecrier.com/v1/posts/pst_7q1w0e" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/posts/{id}

Get a post

Parameters

  • idstringrequired

Response 200

data
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
GET /v1/posts/pst_7q1w0e
curl "https://api.usecrier.com/v1/posts/pst_7q1w0e" \
  -H "Authorization: Bearer $CRIER_API_KEY"
DELETE/v1/posts/{id}

Delete a post

Removes it from Crier. A post that is still live must be unpublished first.

Parameters

  • idstringrequired

Response 204

No content

DELETE /v1/posts/pst_7q1w0e
curl -X DELETE "https://api.usecrier.com/v1/posts/pst_7q1w0e" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/posts/{id}/edit

Edit the text of a live post

On X (Premium accounts, within 1 hour), Facebook, LinkedIn, YouTube, Pinterest, Google Business, Telegram, Discord and Reddit. Media cannot change.

Parameters

  • idstringrequired

Body

  • contentstringrequired

    The new text of the live post.

    max 10,000

  • accountIdstringoptional

    Edit only this account’s copy; every live copy otherwise.

Response 200

data
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
POST /v1/posts/pst_7q1w0e/edit
curl -X POST "https://api.usecrier.com/v1/posts/pst_7q1w0e/edit" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/posts/{id}/metrics

Get the metrics of a post

Impressions, reach, views, likes, comments, shares, saves and clicks, in total and per account. Each network reports its own subset.

Parameters

  • idstringrequired

Response 200

data
  • totalobjectrequired
    total
    • impressionsintegerrequired

      max 9,007,199,254,740,991

    • reachintegerrequired

      max 9,007,199,254,740,991

    • viewsintegerrequired

      max 9,007,199,254,740,991

    • likesintegerrequired

      max 9,007,199,254,740,991

    • commentsintegerrequired

      max 9,007,199,254,740,991

    • sharesintegerrequired

      max 9,007,199,254,740,991

    • savesintegerrequired

      max 9,007,199,254,740,991

    • clicksintegerrequired

      max 9,007,199,254,740,991

    • engagementRatenumberrequired

      Percentage: interactions over impressions (or reach).

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • metricsobjectrequired
      metrics
      • impressionsintegerrequired

        max 9,007,199,254,740,991

      • reachintegerrequired

        max 9,007,199,254,740,991

      • viewsintegerrequired

        max 9,007,199,254,740,991

      • likesintegerrequired

        max 9,007,199,254,740,991

      • commentsintegerrequired

        max 9,007,199,254,740,991

      • sharesintegerrequired

        max 9,007,199,254,740,991

      • savesintegerrequired

        max 9,007,199,254,740,991

      • clicksintegerrequired

        max 9,007,199,254,740,991

      • engagementRatenumberrequired

        Percentage: interactions over impressions (or reach).

  • updatedAtstring (date-time)optional
GET /v1/posts/pst_7q1w0e/metrics
curl "https://api.usecrier.com/v1/posts/pst_7q1w0e/metrics" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/posts/{id}/cancel

Cancel a scheduled post, draft or post waiting for approval

Parameters

  • idstringrequired

Response 200

data
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
POST /v1/posts/pst_7q1w0e/cancel
curl -X POST "https://api.usecrier.com/v1/posts/pst_7q1w0e/cancel" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/posts/{id}/review

Approve or reject a post

Only for posts in pending_approval, by owners, admins or an API key. Approving schedules it for its date, puts it in the queue if it asked for one, or publishes it now if its date already passed. Rejecting returns it to draft with the note and sends post.rejected.

Parameters

  • idstringrequired

Body

  • decisionstringrequired

    approve schedules it (or publishes it now if its date passed); reject returns it to draft.

    Values: approve · reject

  • notestringoptional

    Why, for whoever wrote it. Shown with the draft after a rejection.

    max 1,000

Response 200

data
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
POST /v1/posts/pst_7q1w0e/review
curl -X POST "https://api.usecrier.com/v1/posts/pst_7q1w0e/review" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PUT/v1/posts/{id}/recycling

Recycle a post

Posts it again every every weeks or months as a new post (recycledFrom points back), until maxCopies or until. YouTube and TikTok targets are left out of the copies, and each account can have up to 10 posts recycling. Sending it again changes the rule and keeps the count.

Parameters

  • idstringrequired

Body

  • everyintegerrequired

    How many units between copies.

    max 52

  • unitstringrequired

    week or month.

    Values: week · month

  • startAtstring (date-time)optional

    When the first copy goes out. Defaults to one interval after the post’s date; for an old post, the next date of that series, at the same time of day.

  • maxCopiesintegeroptional

    Stop after this many copies.

    max 100

  • untilstring (date-time)optional

    Stop after this date.

  • variationsstring[]optional

    Texts used in turn instead of the post’s text. A target’s own text still wins. Recommended for X and Pinterest, which flag repeats.

    min 2max 20 items

  • timezonestringoptional

    IANA time zone (e.g. Europe/Madrid) the interval is counted in, so copies keep their local time when the clocks change. UTC by default.

    max 64

Response 200

data
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
PUT /v1/posts/pst_7q1w0e/recycling
curl -X PUT "https://api.usecrier.com/v1/posts/pst_7q1w0e/recycling" \
  -H "Authorization: Bearer $CRIER_API_KEY"
DELETE/v1/posts/{id}/recycling

Stop recycling a post

Copies already created stay as they are.

Parameters

  • idstringrequired

Response 200

data
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
DELETE /v1/posts/pst_7q1w0e/recycling
curl -X DELETE "https://api.usecrier.com/v1/posts/pst_7q1w0e/recycling" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/posts/{id}/retry

Retry the failed targets

Parameters

  • idstringrequired

Response 200

data
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
POST /v1/posts/pst_7q1w0e/retry
curl -X POST "https://api.usecrier.com/v1/posts/pst_7q1w0e/retry" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/posts/{id}/unpublish

Take a published post down

From every network, or only from accountId.

Parameters

  • idstringrequired

Body

  • accountIdstringoptional

Response 200

data
  • idstringrequired
  • contentstringrequired
  • mediaobject[]required
    media
    • typestringrequired

      Values: image · video · gif · document

    • urlstring (uri)required
    • altTextstringoptional

      max 1,000

  • targetsobject[]required
    targets
    • accountIdstringrequired
    • platformstringrequired
    • contentstringoptional
    • mediaobject[]optional
      media
      • typestringrequired

        Values: image · video · gif · document

      • urlstring (uri)required
      • altTextstringoptional

        max 1,000

    • statusstringrequired

      Values: pending · published · failed · removed

    • urlstring (uri)optional

      The live post, once published.

    • errorstringoptional
  • statusstringrequired

    Values: draft · pending_approval · scheduled · publishing · published · partial · failed · cancelled

  • scheduledForstring (date-time)optional
  • approvalobjectoptional

    Present once the post went through review.

    approval
    • requestedBystringoptional

      User who asked for it; absent when an API key did.

    • requestedAtstring (date-time)required
    • queuebooleanoptional

      Approving puts it in the profile’s queue.

    • decisionstringoptional

      Values: approved · rejected

    • decidedBystringoptional
    • decidedAtstring (date-time)optional
    • notestringoptional

      Why it was rejected.

  • recyclingobjectoptional

    Present once recycling was turned on.

    recycling
    • activebooleanrequired
    • everyintegerrequired

      max 9,007,199,254,740,991

    • unitstringrequired

      Values: week · month

    • startAtstring (date-time)optional
    • maxCopiesintegeroptional

      max 9,007,199,254,740,991

    • untilstring (date-time)optional
    • variationsstring[]optional
    • timezonestringoptional
    • copiesintegerrequired

      Copies created so far.

      max 9,007,199,254,740,991

    • nextAtstring (date-time)optional

      When the next copy goes out; absent once it stopped.

    • lastCopyIdstringoptional

      The latest copy, a post of its own.

  • recycledFromstringoptional

    On a recycled copy: the original post.

  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
POST /v1/posts/pst_7q1w0e/unpublish
curl -X POST "https://api.usecrier.com/v1/posts/pst_7q1w0e/unpublish" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_3k9x2m"
  }'

Media

Upload images and videos to Crier before posting them.

POST/v1/media/upload-url

Get an upload URL

JPEG, PNG, WebP and GIF up to 20 MB; MP4, MOV and WebM up to 1 GB. PUT the file to uploadUrl, then post publicUrl.

Body

  • filenamestringrequired

    max 255

  • contentTypestringrequired

    min 3

  • sizeintegerrequired

    max 9,007,199,254,740,991

Response 200

data
  • uploadUrlstring (uri)required

    Pre-signed URL: PUT the file there with the same Content-Type.

  • publicUrlstring (uri)required

    Use it in a post's media once uploaded.

  • kindstringrequired

    Values: image · gif · video

  • expiresInintegerrequired

    Seconds the upload URL stays valid.

    max 9,007,199,254,740,991

POST /v1/media/upload-url
curl -X POST "https://api.usecrier.com/v1/media/upload-url" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "autumn.mp4",
    "contentType": "video/mp4",
    "size": 48211234
  }'

Inbox

Direct messages, comments and reviews of a profile’s accounts. Lists take the profile; actions take the account the item belongs to.

GET/v1/inbox/conversations

List conversations

Direct messages on Facebook, Instagram, X, Bluesky, Reddit and Telegram, most recent first.

Parameters

  • profileIdstringrequired
  • accountIdstringoptional
  • statusstringoptional

    Values: active · archived

  • cursorstringoptional

    nextCursor of the previous page.

    max 4,000

  • limitintegeroptional

    max 100

Response 200

data
  • itemsobject[]required
    items
    • idstringrequired

      Opaque conversation id.

    • accountIdstringrequired
    • platformstringrequired
    • participantobjectrequired
      participant
      • namestringoptional
      • usernamestringoptional
      • picturestring (uri)optional
    • lastMessagestringoptional
    • updatedAtstring (date-time)optional
    • statusstringrequired

      Values: active · archived

    • unreadCountintegerrequired

      max 9,007,199,254,740,991

    • urlstring (uri)optional

      Opens the conversation on the network.

  • nextCursorstring | nullrequired

    Send it as cursor for the next page; null on the last one.

GET /v1/inbox/conversations
curl "https://api.usecrier.com/v1/inbox/conversations" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/inbox/conversations/{id}/messages

List the messages of a conversation

Parameters

  • idstringrequired
  • accountIdstringrequired

    The account the item belongs to.

  • cursorstringoptional

    nextCursor of the previous page.

    max 4,000

Response 200

data
  • itemsobject[]required
    items
    • idstringrequired
    • directionstringrequired

      Values: incoming · outgoing

    • textstringrequired
    • senderNamestringoptional
    • createdAtstring (date-time)required
    • attachmentsobject[]required
      attachments
      • typestringrequired

        Values: image · video · audio · file · sticker · share · other

      • urlstring (uri)optional
      • namestringoptional
    • deliveryStatusstringoptional
    • deletedbooleanrequired
  • nextCursorstring | nullrequired

    Send it as cursor for the next page; null on the last one.

GET /v1/inbox/conversations/key_2b4n6m/messages
curl "https://api.usecrier.com/v1/inbox/conversations/key_2b4n6m/messages" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/inbox/conversations/{id}/messages

Send a message

Text, an attachment or both. Meta only lets a page answer within 24 hours of the person’s last message.

Parameters

  • idstringrequired

Body

  • accountIdstringrequired

    The account the item belongs to.

  • textstringoptional

    max 4,000

  • attachmentUrlstring (uri)optional

    A public https URL (for example from POST /v1/media/upload-url).

  • attachmentTypestringoptional

    Values: image · video · audio · file

Response 204

No content

POST /v1/inbox/conversations/key_2b4n6m/messages
curl -X POST "https://api.usecrier.com/v1/inbox/conversations/key_2b4n6m/messages" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/inbox/conversations/{id}/read

Mark a conversation as read

Parameters

  • idstringrequired

Body

  • accountIdstringrequired

    The account the item belongs to.

Response 204

No content

POST /v1/inbox/conversations/key_2b4n6m/read
curl -X POST "https://api.usecrier.com/v1/inbox/conversations/key_2b4n6m/read" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PATCH/v1/inbox/conversations/{id}

Archive or reopen a conversation

Parameters

  • idstringrequired

Body

  • accountIdstringrequired

    The account the item belongs to.

  • statusstringrequired

    Values: active · archived

Response 204

No content

PATCH /v1/inbox/conversations/key_2b4n6m
curl -X PATCH "https://api.usecrier.com/v1/inbox/conversations/key_2b4n6m" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/inbox/posts

List posts with comments

Recent posts of the profile’s accounts with their comment counts, including posts published outside Crier.

Parameters

  • profileIdstringrequired
  • accountIdstringoptional
  • cursorstringoptional

    nextCursor of the previous page.

    max 4,000

  • limitintegeroptional

    max 100

Response 200

data
  • itemsobject[]required
    items
    • idstringrequired

      Opaque post id for the comment endpoints.

    • accountIdstringrequired
    • platformstringrequired
    • contentstringrequired
    • picturestring (uri)optional
    • urlstring (uri)optional
    • createdAtstring (date-time)optional
    • commentCountintegerrequired

      max 9,007,199,254,740,991

    • likeCountintegerrequired

      max 9,007,199,254,740,991

  • nextCursorstring | nullrequired

    Send it as cursor for the next page; null on the last one.

GET /v1/inbox/posts
curl "https://api.usecrier.com/v1/inbox/posts" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/inbox/posts/{id}/comments

List the comments of a post

Parameters

  • idstringrequired
  • accountIdstringrequired

    The account the item belongs to.

  • cursorstringoptional

    nextCursor of the previous page.

    max 4,000

Response 200

data
  • itemsobject[]required
    items
    • idstringrequired

      Opaque comment id.

    • textstringrequired
    • authorobjectrequired
      author
      • namestringoptional
      • usernamestringoptional
      • picturestring (uri)optional
      • isOwnerbooleanrequired

        Written by the connected account.

    • createdAtstring (date-time)optional
    • likeCountintegerrequired

      max 9,007,199,254,740,991

    • replyCountintegerrequired

      max 9,007,199,254,740,991

    • urlstring (uri)optional
    • canobjectrequired

      What this network allows on it.

      can
      • replybooleanrequired
      • deletebooleanrequired
      • hidebooleanrequired
      • likebooleanrequired
    • hiddenbooleanrequired
    • likedbooleanrequired
    • repliesobject[]required
      replies
      • idstringrequired

        Opaque comment id.

      • textstringrequired
      • authorobjectrequired
        author
        • namestringoptional
        • usernamestringoptional
        • picturestring (uri)optional
        • isOwnerbooleanrequired

          Written by the connected account.

      • createdAtstring (date-time)optional
      • likeCountintegerrequired

        max 9,007,199,254,740,991

      • replyCountintegerrequired

        max 9,007,199,254,740,991

      • urlstring (uri)optional
      • canobjectrequired

        What this network allows on it.

        can
        • replybooleanrequired
        • deletebooleanrequired
        • hidebooleanrequired
        • likebooleanrequired
      • hiddenbooleanrequired
      • likedbooleanrequired
  • nextCursorstring | nullrequired

    Send it as cursor for the next page; null on the last one.

GET /v1/inbox/posts/key_2b4n6m/comments
curl "https://api.usecrier.com/v1/inbox/posts/key_2b4n6m/comments" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/inbox/posts/{id}/comments

Comment or reply to a comment

Parameters

  • idstringrequired

Body

  • accountIdstringrequired

    The account the item belongs to.

  • textstringrequired

    max 8,000

  • commentIdstringoptional

    Reply under this comment; omit to comment on the post.

Response 204

No content

POST /v1/inbox/posts/key_2b4n6m/comments
curl -X POST "https://api.usecrier.com/v1/inbox/posts/key_2b4n6m/comments" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PATCH/v1/inbox/posts/{id}/comments/{commentId}

Hide or like a comment

Each comment says in can what its network allows.

Parameters

  • idstringrequired
  • commentIdstringrequired

Body

  • accountIdstringrequired

    The account the item belongs to.

  • hiddenbooleanoptional
  • likedbooleanoptional

Response 204

No content

PATCH /v1/inbox/posts/key_2b4n6m/comments/{commentId}
curl -X PATCH "https://api.usecrier.com/v1/inbox/posts/key_2b4n6m/comments/{commentId}" \
  -H "Authorization: Bearer $CRIER_API_KEY"
DELETE/v1/inbox/posts/{id}/comments/{commentId}

Delete a comment

Parameters

  • idstringrequired
  • commentIdstringrequired
  • accountIdstringrequired

    The account the item belongs to.

Response 204

No content

DELETE /v1/inbox/posts/key_2b4n6m/comments/{commentId}
curl -X DELETE "https://api.usecrier.com/v1/inbox/posts/key_2b4n6m/comments/{commentId}" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/inbox/reviews

List reviews

Google Business and Facebook reviews, with their total and average rating.

Parameters

  • profileIdstringrequired
  • accountIdstringoptional
  • cursorstringoptional

    nextCursor of the previous page.

    max 4,000

  • limitintegeroptional

    max 100

  • hasReplystringoptional

    Only reviews with (true) or without (false) a reply.

    Values: true · false

Response 200

data
  • itemsobject[]required
    items
    • idstringrequired

      Opaque review id.

    • accountIdstringrequired
    • platformstringrequired
    • reviewerobjectrequired
      reviewer
      • namestringoptional
      • usernamestringoptional
      • picturestring (uri)optional
    • ratinginteger | nullrequired

      1 to 5; null on Facebook, which recommends instead.

    • recommendsbooleanoptional
    • textstringrequired
    • createdAtstring (date-time)optional
    • replyobject | nullrequired
      reply
      • textstringrequired
      • createdAtstring (date-time)optional
    • urlstring (uri)optional
    • locationstringoptional

      Google Business location.

  • nextCursorstring | nullrequired

    Send it as cursor for the next page; null on the last one.

  • summaryobjectrequired
    summary
    • totalintegerrequired

      max 9,007,199,254,740,991

    • averageRatingnumber | nullrequired
GET /v1/inbox/reviews
curl "https://api.usecrier.com/v1/inbox/reviews" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/inbox/reviews/{id}/reply

Reply to a review

Parameters

  • idstringrequired

Body

  • accountIdstringrequired

    The account the item belongs to.

  • textstringrequired

    max 4,000

Response 204

No content

POST /v1/inbox/reviews/key_2b4n6m/reply
curl -X POST "https://api.usecrier.com/v1/inbox/reviews/key_2b4n6m/reply" \
  -H "Authorization: Bearer $CRIER_API_KEY"
DELETE/v1/inbox/reviews/{id}/reply

Delete a review reply

Google Business only.

Parameters

  • idstringrequired
  • accountIdstringrequired

    The account the item belongs to.

Response 204

No content

DELETE /v1/inbox/reviews/key_2b4n6m/reply
curl -X DELETE "https://api.usecrier.com/v1/inbox/reviews/key_2b4n6m/reply" \
  -H "Authorization: Bearer $CRIER_API_KEY"

Automations

Comment-to-DM: when someone comments a keyword, answer with a private message (Instagram, Facebook) or a public reply (every network).

GET/v1/automations

List automations

Parameters

  • profileIdstringrequired
  • accountIdstringoptional

Response 200

data []
  • idstringrequired
  • accountIdstringrequired
  • platformstringrequired
  • namestringrequired
  • triggerstringrequired

    Values: comment · story_reply

  • postIdstring | nullrequired
  • inboxPostIdstring | nullrequired
  • keywordsstring[]required
  • matchModestringrequired

    Values: contains · word · exact

  • excludeKeywordsstring[]required
  • dmMessagestringoptional
  • buttonsobject[]required
    buttons
    • typestringrequired

      Values: url · postback

    • titlestringrequired
    • urlstring (uri)optional
    • payloadstringoptional
  • commentReplystringoptional
  • dmDelaySecondsintegeroptional

    max 9,007,199,254,740,991

  • repeatstringrequired

    Values: once · every_comment

  • likeCommentbooleanrequired
  • hideCommentbooleanrequired
  • activebooleanrequired
  • statsobjectrequired
    stats
    • triggeredintegerrequired

      max 9,007,199,254,740,991

    • dmsSentintegerrequired

      max 9,007,199,254,740,991

    • dmsFailedintegerrequired

      max 9,007,199,254,740,991

    • uniqueContactsintegerrequired

      max 9,007,199,254,740,991

    • linkClicksintegerrequired

      max 9,007,199,254,740,991

  • createdAtstring (date-time)optional
GET /v1/automations
curl "https://api.usecrier.com/v1/automations" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/automations

Create an automation

On Instagram and Facebook it sends dmMessage (with up to 3 buttons) to whoever comments a keyword; on TikTok, Threads, LinkedIn and YouTube it posts commentReply. Without a post it watches every post of the account.

Body

  • namestringrequired

    max 100

  • triggerstringoptional

    story_reply: replies to an Instagram story.

    Values: comment · story_replyDefault: "comment"

  • postIdstring | nulloptional

    A Crier post to watch.

  • inboxPostIdstring | nulloptional

    Or a post as GET /v1/inbox/posts lists it. Neither: every post.

  • keywordsstring[]optional

    Empty: any comment fires it.

    Default: []max 50 items

  • matchModestringoptional

    Values: contains · word · exactDefault: "contains"

  • excludeKeywordsstring[]optional

    Default: []max 50 items

  • dmMessagestringoptional

    Private message to the commenter. Instagram and Facebook only, required there.

    max 1,000

  • buttonsobject[]optional

    Up to 3 buttons under the DM.

    Default: []max 3 items

    buttons
    • typestringrequired

      Values: url · postback

    • titlestringrequired

      max 20

    • urlstring (uri)optional
    • payloadstringoptional

      max 1,000

  • commentReplystringoptional

    Public reply to the comment. Required on TikTok, Threads, LinkedIn and YouTube.

    max 2,000

  • dmDelaySecondsintegeroptional

    max 86,400

  • repeatstringoptional

    once: one DM per person.

    Values: once · every_commentDefault: "once"

  • likeCommentbooleanoptional

    Default: false

  • hideCommentbooleanoptional

    Default: false

  • activebooleanoptional

    Default: true

  • accountIdstringrequired

    Instagram, Facebook, TikTok, Threads, LinkedIn or YouTube account.

Response 201

data
  • idstringrequired
  • accountIdstringrequired
  • platformstringrequired
  • namestringrequired
  • triggerstringrequired

    Values: comment · story_reply

  • postIdstring | nullrequired
  • inboxPostIdstring | nullrequired
  • keywordsstring[]required
  • matchModestringrequired

    Values: contains · word · exact

  • excludeKeywordsstring[]required
  • dmMessagestringoptional
  • buttonsobject[]required
    buttons
    • typestringrequired

      Values: url · postback

    • titlestringrequired
    • urlstring (uri)optional
    • payloadstringoptional
  • commentReplystringoptional
  • dmDelaySecondsintegeroptional

    max 9,007,199,254,740,991

  • repeatstringrequired

    Values: once · every_comment

  • likeCommentbooleanrequired
  • hideCommentbooleanrequired
  • activebooleanrequired
  • statsobjectrequired
    stats
    • triggeredintegerrequired

      max 9,007,199,254,740,991

    • dmsSentintegerrequired

      max 9,007,199,254,740,991

    • dmsFailedintegerrequired

      max 9,007,199,254,740,991

    • uniqueContactsintegerrequired

      max 9,007,199,254,740,991

    • linkClicksintegerrequired

      max 9,007,199,254,740,991

  • createdAtstring (date-time)optional
POST /v1/automations
curl -X POST "https://api.usecrier.com/v1/automations" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/automations/{id}

Get an automation

Parameters

  • idstringrequired

Response 200

data
  • idstringrequired
  • accountIdstringrequired
  • platformstringrequired
  • namestringrequired
  • triggerstringrequired

    Values: comment · story_reply

  • postIdstring | nullrequired
  • inboxPostIdstring | nullrequired
  • keywordsstring[]required
  • matchModestringrequired

    Values: contains · word · exact

  • excludeKeywordsstring[]required
  • dmMessagestringoptional
  • buttonsobject[]required
    buttons
    • typestringrequired

      Values: url · postback

    • titlestringrequired
    • urlstring (uri)optional
    • payloadstringoptional
  • commentReplystringoptional
  • dmDelaySecondsintegeroptional

    max 9,007,199,254,740,991

  • repeatstringrequired

    Values: once · every_comment

  • likeCommentbooleanrequired
  • hideCommentbooleanrequired
  • activebooleanrequired
  • statsobjectrequired
    stats
    • triggeredintegerrequired

      max 9,007,199,254,740,991

    • dmsSentintegerrequired

      max 9,007,199,254,740,991

    • dmsFailedintegerrequired

      max 9,007,199,254,740,991

    • uniqueContactsintegerrequired

      max 9,007,199,254,740,991

    • linkClicksintegerrequired

      max 9,007,199,254,740,991

  • createdAtstring (date-time)optional
GET /v1/automations/key_2b4n6m
curl "https://api.usecrier.com/v1/automations/key_2b4n6m" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PATCH/v1/automations/{id}

Update or pause an automation

Fields you leave out keep their value. active: false pauses it.

Parameters

  • idstringrequired

Body

  • namestringoptional

    max 100

  • triggerstringoptional

    story_reply: replies to an Instagram story.

    Values: comment · story_reply

  • postIdstring | nulloptional

    A Crier post to watch.

  • inboxPostIdstring | nulloptional

    Or a post as GET /v1/inbox/posts lists it. Neither: every post.

  • keywordsstring[]optional

    Empty: any comment fires it.

    max 50 items

  • matchModestringoptional

    Values: contains · word · exact

  • excludeKeywordsstring[]optional

    max 50 items

  • dmMessagestringoptional

    Private message to the commenter. Instagram and Facebook only, required there.

    max 1,000

  • buttonsobject[]optional

    Up to 3 buttons under the DM.

    max 3 items

    buttons
    • typestringrequired

      Values: url · postback

    • titlestringrequired

      max 20

    • urlstring (uri)optional
    • payloadstringoptional

      max 1,000

  • commentReplystringoptional

    Public reply to the comment. Required on TikTok, Threads, LinkedIn and YouTube.

    max 2,000

  • dmDelaySecondsintegeroptional

    max 86,400

  • repeatstringoptional

    once: one DM per person.

    Values: once · every_comment

  • likeCommentbooleanoptional
  • hideCommentbooleanoptional
  • activebooleanoptional

Response 200

data
  • idstringrequired
  • accountIdstringrequired
  • platformstringrequired
  • namestringrequired
  • triggerstringrequired

    Values: comment · story_reply

  • postIdstring | nullrequired
  • inboxPostIdstring | nullrequired
  • keywordsstring[]required
  • matchModestringrequired

    Values: contains · word · exact

  • excludeKeywordsstring[]required
  • dmMessagestringoptional
  • buttonsobject[]required
    buttons
    • typestringrequired

      Values: url · postback

    • titlestringrequired
    • urlstring (uri)optional
    • payloadstringoptional
  • commentReplystringoptional
  • dmDelaySecondsintegeroptional

    max 9,007,199,254,740,991

  • repeatstringrequired

    Values: once · every_comment

  • likeCommentbooleanrequired
  • hideCommentbooleanrequired
  • activebooleanrequired
  • statsobjectrequired
    stats
    • triggeredintegerrequired

      max 9,007,199,254,740,991

    • dmsSentintegerrequired

      max 9,007,199,254,740,991

    • dmsFailedintegerrequired

      max 9,007,199,254,740,991

    • uniqueContactsintegerrequired

      max 9,007,199,254,740,991

    • linkClicksintegerrequired

      max 9,007,199,254,740,991

  • createdAtstring (date-time)optional
PATCH /v1/automations/key_2b4n6m
curl -X PATCH "https://api.usecrier.com/v1/automations/key_2b4n6m" \
  -H "Authorization: Bearer $CRIER_API_KEY"
DELETE/v1/automations/{id}

Delete an automation

Parameters

  • idstringrequired

Response 204

No content

DELETE /v1/automations/key_2b4n6m
curl -X DELETE "https://api.usecrier.com/v1/automations/key_2b4n6m" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/automations/{id}/logs

What an automation did

Every comment that fired it, newest first, with the DM outcome.

Parameters

  • idstringrequired
  • skipintegeroptional

    max 9,007,199,254,740,991

  • limitintegeroptional

    max 100

Response 200

data
  • itemsobject[]required
    items
    • idstringrequired
    • commenterobjectrequired
      commenter
      • namestringoptional
      • usernamestringoptional
    • commentTextstringoptional
    • statusstringrequired

      Values: pending · sent · failed · skipped · gated

    • errorstringoptional
    • replyStatusstringoptional
    • clickedbooleanrequired
    • createdAtstring (date-time)required
  • totalintegerrequired

    max 9,007,199,254,740,991

GET /v1/automations/key_2b4n6m/logs
curl "https://api.usecrier.com/v1/automations/key_2b4n6m/logs" \
  -H "Authorization: Bearer $CRIER_API_KEY"

Analytics

Followers, daily totals, best times to post and top posts, per profile or per account.

GET/v1/analytics/followers

Followers and growth

Current followers, growth over the period and the daily history of each account. Refreshed once a day.

Parameters

  • profileIdstringrequired
  • accountIdstringoptional

    Only this account; the whole profile otherwise.

  • fromstringoptional

    First day (YYYY-MM-DD). Defaults to 30 days ago.

  • tostringoptional

    Last day (YYYY-MM-DD). Defaults to today.

Response 200

data []
  • accountIdstringrequired
  • platformstringrequired
  • usernamestringoptional
  • followersintegerrequired

    max 9,007,199,254,740,991

  • growthintegerrequired

    Change over the period.

    max 9,007,199,254,740,991

  • growthPercentnumberrequired
  • historyobject[]required
    history
    • datestringrequired

      YYYY-MM-DD

    • followersintegerrequired

      max 9,007,199,254,740,991

GET /v1/analytics/followers
curl "https://api.usecrier.com/v1/analytics/followers" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/analytics/daily

Daily totals

Posts and engagement per day (counted on the day it arrived), and totals per network.

Parameters

  • profileIdstringrequired
  • accountIdstringoptional

    Only this account; the whole profile otherwise.

  • fromstringoptional

    First day (YYYY-MM-DD). Defaults to 30 days ago.

  • tostringoptional

    Last day (YYYY-MM-DD). Defaults to today.

Response 200

data
  • daysobject[]required
    days
    • datestringrequired

      YYYY-MM-DD

    • postsintegerrequired

      max 9,007,199,254,740,991

    • metricsobjectrequired
      metrics
      • impressionsintegerrequired

        max 9,007,199,254,740,991

      • reachintegerrequired

        max 9,007,199,254,740,991

      • viewsintegerrequired

        max 9,007,199,254,740,991

      • likesintegerrequired

        max 9,007,199,254,740,991

      • commentsintegerrequired

        max 9,007,199,254,740,991

      • sharesintegerrequired

        max 9,007,199,254,740,991

      • savesintegerrequired

        max 9,007,199,254,740,991

      • clicksintegerrequired

        max 9,007,199,254,740,991

      • engagementRatenumberrequired

        Percentage: interactions over impressions (or reach).

  • byPlatformobject[]required
    byPlatform
    • platformstringrequired
    • postsintegerrequired

      max 9,007,199,254,740,991

    • metricsobjectrequired
      metrics
      • impressionsintegerrequired

        max 9,007,199,254,740,991

      • reachintegerrequired

        max 9,007,199,254,740,991

      • viewsintegerrequired

        max 9,007,199,254,740,991

      • likesintegerrequired

        max 9,007,199,254,740,991

      • commentsintegerrequired

        max 9,007,199,254,740,991

      • sharesintegerrequired

        max 9,007,199,254,740,991

      • savesintegerrequired

        max 9,007,199,254,740,991

      • clicksintegerrequired

        max 9,007,199,254,740,991

      • engagementRatenumberrequired

        Percentage: interactions over impressions (or reach).

GET /v1/analytics/daily
curl "https://api.usecrier.com/v1/analytics/daily" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/analytics/best-times

Best times to post

Average engagement per weekday and hour, from the account’s published posts.

Parameters

  • profileIdstringrequired
  • accountIdstringoptional

    Only this account; the whole profile otherwise.

Response 200

data []
  • dayOfWeekintegerrequired

    0 = Sunday … 6 = Saturday

    max 9,007,199,254,740,991

  • hourintegerrequired

    Hour in UTC

    max 9,007,199,254,740,991

  • avgEngagementnumberrequired
  • postsintegerrequired

    max 9,007,199,254,740,991

GET /v1/analytics/best-times
curl "https://api.usecrier.com/v1/analytics/best-times" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/analytics/top-posts

Top posts

Posts of the period by engagement (or date), including those published outside Crier.

Parameters

  • profileIdstringrequired
  • accountIdstringoptional

    Only this account; the whole profile otherwise.

  • fromstringoptional

    First day (YYYY-MM-DD). Defaults to 30 days ago.

  • tostringoptional

    Last day (YYYY-MM-DD). Defaults to today.

  • sortBystringoptional

    Values: engagement · date

  • limitintegeroptional

    max 50

Response 200

data []
  • postIdstring | nullrequired

    The Crier post, when it was published through Crier.

  • accountIdstring | nullrequired
  • platformstringrequired
  • contentstringrequired
  • publishedAtstring (date-time)optional
  • urlstring (uri)optional
  • thumbnailUrlstring (uri)optional
  • metricsobjectrequired
    metrics
    • impressionsintegerrequired

      max 9,007,199,254,740,991

    • reachintegerrequired

      max 9,007,199,254,740,991

    • viewsintegerrequired

      max 9,007,199,254,740,991

    • likesintegerrequired

      max 9,007,199,254,740,991

    • commentsintegerrequired

      max 9,007,199,254,740,991

    • sharesintegerrequired

      max 9,007,199,254,740,991

    • savesintegerrequired

      max 9,007,199,254,740,991

    • clicksintegerrequired

      max 9,007,199,254,740,991

    • engagementRatenumberrequired

      Percentage: interactions over impressions (or reach).

  • externalbooleanrequired

    Published outside Crier.

GET /v1/analytics/top-posts
curl "https://api.usecrier.com/v1/analytics/top-posts" \
  -H "Authorization: Bearer $CRIER_API_KEY"

Billing

A prepaid balance: connected accounts beyond the free ones are charged day by day and usage (X API, messages) as it happens. Topping it up happens in the dashboard.

GET/v1/billing

Get the balance

Balance, connected accounts and what they cost. With the balance used up, connecting beyond the free accounts, and publishing or sending from accounts beyond them or on X, answer 402.

Response 200

data
  • enabledbooleanrequired

    False while billing is not available: nothing is charged or limited.

  • balancenumberrequired

    Prepaid balance in cents (up to three decimals). Negative when charges outran it.

  • currencystringrequired
  • connectedAccountsintegerrequired

    max 9,007,199,254,740,991

  • freeAccountsintegerrequired

    max 9,007,199,254,740,991

  • monthlyEstimateintegerrequired

    Monthly price of the accounts connected now, in cents. It is charged day by day.

    max 9,007,199,254,740,991

  • dailyEstimatenumberrequired

    What those accounts cost today, in cents (up to three decimals).

  • daysLeftinteger | nullrequired

    Whole days the balance covers at that cost; null when nothing is charged daily.

  • linesobject[]required
    lines
    • fromintegerrequired

      max 9,007,199,254,740,991

    • tointeger | nullrequired
    • accountsintegerrequired

      max 9,007,199,254,740,991

    • unitAmountintegerrequired

      Cents per account and month.

      max 9,007,199,254,740,991

    • amountintegerrequired

      max 9,007,199,254,740,991

  • canConnectMorebooleanrequired

    Whether one more account can be connected right now.

  • blockedbooleanrequired

    The balance is used up: accounts beyond the free ones, and X accounts, cannot publish or send until it is topped up.

  • cardobjectoptional

    The saved payment method, for automatic recharges.

    card
    • brandstringrequired

      Card brand (visa, mastercard…) or another saved method (link, sepa_debit).

    • last4stringoptional
    • expMonthintegeroptional

      max 9,007,199,254,740,991

    • expYearintegeroptional

      max 9,007,199,254,740,991

  • autoRechargeobjectoptional
    autoRecharge
    • enabledbooleanrequired
    • thresholdintegerrequired

      Recharge when the balance falls below this, in cents.

      max 9,007,199,254,740,991

    • amountintegerrequired

      What each recharge adds, in cents.

      max 9,007,199,254,740,991

    • monthlyLimitintegerrequired

      Most that automatic recharges add in a calendar month, in cents.

      max 9,007,199,254,740,991

  • autoRechargeErrorobjectoptional

    Why the last automatic recharge failed; it switched itself off.

    autoRechargeError
    • atstring (date-time)required
    • messagestringrequired
  • autoRechargedThisMonthintegerrequired

    Added by automatic recharges this calendar month, in cents.

    max 9,007,199,254,740,991

  • topUpobjectrequired

    Allowed top-up amounts, in cents.

    topUp
    • minintegerrequired

      max 9,007,199,254,740,991

    • maxintegerrequired

      max 9,007,199,254,740,991

  • hasPortalbooleanrequired

    Whether the billing portal (invoices, payment method) is available.

GET /v1/billing
curl "https://api.usecrier.com/v1/billing" \
  -H "Authorization: Bearer $CRIER_API_KEY"
GET/v1/billing/movements

List balance movements

Top-ups and charges, newest first.

Parameters

  • limitintegeroptional

    max 200

Response 200

data []
  • idstringrequired
  • kindstringrequired

    Values: top_up · auto_recharge · accounts · usage · adjustment

  • amountnumberrequired

    Cents (up to three decimals): positive adds, negative debits.

  • atstring (date-time)required
  • daystringoptional

    UTC day (YYYY-MM-DD) a charge covers.

  • accountsintegeroptional

    Accounts a day was charged for.

    max 9,007,199,254,740,991

  • familystringoptional

    Usage family of a usage charge.

    Values: xApi · messages

GET /v1/billing/movements
curl "https://api.usecrier.com/v1/billing/movements" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/billing/top-up

Top up the balance

Dashboard only

Opens a payment page. The balance grows once the payment succeeds; the card is saved for automatic recharges.

Body

  • amountintegerrequired

    Balance to add, in cents (taxes, if any, on top). Limits come with GET /v1/billing.

    max 9,007,199,254,740,991

  • successUrlstring (uri)required

    Dashboard page to come back to after paying.

  • cancelUrlstring (uri)required

    Dashboard page to come back to if the user leaves Checkout.

Response 200

data
  • urlstring (uri)required

    Send the user here.

POST /v1/billing/top-up
curl -X POST "https://api.usecrier.com/v1/billing/top-up" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PUT/v1/billing/auto-recharge

Set automatic recharges

Dashboard only

Tops up the saved card when the balance falls below the threshold, up to a monthly limit. Needs one top-up first.

Body

  • enabledbooleanrequired
  • thresholdintegerrequired

    Recharge when the balance falls below this, in cents.

    max 9,007,199,254,740,991

  • amountintegerrequired

    What each recharge adds, in cents.

    max 9,007,199,254,740,991

  • monthlyLimitintegerrequired

    Most that automatic recharges may add in a calendar month, in cents.

    max 9,007,199,254,740,991

Response 200

data
  • enabledbooleanrequired

    False while billing is not available: nothing is charged or limited.

  • balancenumberrequired

    Prepaid balance in cents (up to three decimals). Negative when charges outran it.

  • currencystringrequired
  • connectedAccountsintegerrequired

    max 9,007,199,254,740,991

  • freeAccountsintegerrequired

    max 9,007,199,254,740,991

  • monthlyEstimateintegerrequired

    Monthly price of the accounts connected now, in cents. It is charged day by day.

    max 9,007,199,254,740,991

  • dailyEstimatenumberrequired

    What those accounts cost today, in cents (up to three decimals).

  • daysLeftinteger | nullrequired

    Whole days the balance covers at that cost; null when nothing is charged daily.

  • linesobject[]required
    lines
    • fromintegerrequired

      max 9,007,199,254,740,991

    • tointeger | nullrequired
    • accountsintegerrequired

      max 9,007,199,254,740,991

    • unitAmountintegerrequired

      Cents per account and month.

      max 9,007,199,254,740,991

    • amountintegerrequired

      max 9,007,199,254,740,991

  • canConnectMorebooleanrequired

    Whether one more account can be connected right now.

  • blockedbooleanrequired

    The balance is used up: accounts beyond the free ones, and X accounts, cannot publish or send until it is topped up.

  • cardobjectoptional

    The saved payment method, for automatic recharges.

    card
    • brandstringrequired

      Card brand (visa, mastercard…) or another saved method (link, sepa_debit).

    • last4stringoptional
    • expMonthintegeroptional

      max 9,007,199,254,740,991

    • expYearintegeroptional

      max 9,007,199,254,740,991

  • autoRechargeobjectoptional
    autoRecharge
    • enabledbooleanrequired
    • thresholdintegerrequired

      Recharge when the balance falls below this, in cents.

      max 9,007,199,254,740,991

    • amountintegerrequired

      What each recharge adds, in cents.

      max 9,007,199,254,740,991

    • monthlyLimitintegerrequired

      Most that automatic recharges add in a calendar month, in cents.

      max 9,007,199,254,740,991

  • autoRechargeErrorobjectoptional

    Why the last automatic recharge failed; it switched itself off.

    autoRechargeError
    • atstring (date-time)required
    • messagestringrequired
  • autoRechargedThisMonthintegerrequired

    Added by automatic recharges this calendar month, in cents.

    max 9,007,199,254,740,991

  • topUpobjectrequired

    Allowed top-up amounts, in cents.

    topUp
    • minintegerrequired

      max 9,007,199,254,740,991

    • maxintegerrequired

      max 9,007,199,254,740,991

  • hasPortalbooleanrequired

    Whether the billing portal (invoices, payment method) is available.

PUT /v1/billing/auto-recharge
curl -X PUT "https://api.usecrier.com/v1/billing/auto-recharge" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/billing/portal

Open the billing portal

Dashboard only

Invoices and the saved payment method.

Body

  • returnUrlstring (uri)required

    Dashboard page to come back to.

Response 200

data
  • urlstring (uri)required

    Send the user here.

POST /v1/billing/portal
curl -X POST "https://api.usecrier.com/v1/billing/portal" \
  -H "Authorization: Bearer $CRIER_API_KEY"

Webhooks

Receive Crier events at your HTTPS endpoint.

GET/v1/webhook-endpoint

Get the webhook endpoint

Response 200

data
  • urlstring (uri)required
  • eventsstring[]required
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
GET /v1/webhook-endpoint
curl "https://api.usecrier.com/v1/webhook-endpoint" \
  -H "Authorization: Bearer $CRIER_API_KEY"
PUT/v1/webhook-endpoint

Set the webhook endpoint

Omit events to receive all of them. The signing secret is returned only the first time.

Body

  • urlstring (starts_with)required
  • eventsstring[]optional

Response 200

data
  • endpointobjectrequired
    endpoint
    • urlstring (uri)required
    • eventsstring[]required
    • createdAtstring (date-time)required
    • updatedAtstring (date-time)required
  • secretstringoptional

    Signing secret, returned only when the endpoint is created.

PUT /v1/webhook-endpoint
curl -X PUT "https://api.usecrier.com/v1/webhook-endpoint" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://app.acme.com/webhooks/crier"
  }'
DELETE/v1/webhook-endpoint

Delete the webhook endpoint

Response 204

No content

DELETE /v1/webhook-endpoint
curl -X DELETE "https://api.usecrier.com/v1/webhook-endpoint" \
  -H "Authorization: Bearer $CRIER_API_KEY"

Api keys

Manage API keys. Only from the dashboard, so a leaked key cannot mint new ones.

GET/v1/api-keys

List API keys

Dashboard only

Response 200

data []
  • idstringrequired
  • namestringrequired
  • prefixstringrequired
  • createdAtstring (date-time)required
  • revokedAtstring (date-time)optional
GET /v1/api-keys
curl "https://api.usecrier.com/v1/api-keys" \
  -H "Authorization: Bearer $CRIER_API_KEY"
POST/v1/api-keys

Create an API key

Dashboard only

Body

  • namestringrequired

    max 60

Response 201

data
  • keyobjectrequired
    key
    • idstringrequired
    • namestringrequired
    • prefixstringrequired
    • createdAtstring (date-time)required
    • revokedAtstring (date-time)optional
  • secretstringrequired

    The full key, shown only this once.

POST /v1/api-keys
curl -X POST "https://api.usecrier.com/v1/api-keys" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "production"
  }'
DELETE/v1/api-keys/{id}

Revoke an API key

Dashboard only

Parameters

  • idstringrequired

Response 204

No content

DELETE /v1/api-keys/key_2b4n6m
curl -X DELETE "https://api.usecrier.com/v1/api-keys/key_2b4n6m" \
  -H "Authorization: Bearer $CRIER_API_KEY"
🚧 Not ready yet

We're finishing building it

Crier is in early access. Leave your email and you'll be among the first in, with launch terms.

or with your email

No spam. We'll only write to give you access.

You're on the list!

We'll write to you as soon as your access is ready.