llms.txt
+83 −24
https://crestnote.com/llms.txt
− > Schedule and publish social posts, read the metrics they earned, and read what− > named competitor accounts are doing, from one workspace-scoped API. There is a− > REST interface and an MCP server, and both call the same functions, so an agent− > and a script always see the same rows.− otherwise publish twice to a live account.− (`billing_hold`). A write that would queue a post answers 423 with one of− those codes, and a draft is still saved. Do not retry it: tell a person.− - `GET /me` (member): Describe this token. Which workspace the token belongs to and what it may do. It reads one row and changes nothing, so it is the call to make when checking that a token works, and the workspace name is what an automation tool shows beside the connection. A read-only token answers `member` here and is refused by every endpoint that needs `admin`.− - `GET /posts` (member): List posts. The queue and its history, newest scheduled time first. Filter by status to find what is waiting on a human (`awaiting_approval`), what is about to go out (`scheduled`), or what already did (`published`). A post still `scheduled` more than a few minutes after its time is being held, not sent: publishing is paused for the workspace or for that account, we have suspended the workspace, the workspace is on hold while the agency it is billed through has not paid,− - `POST /posts` (admin): Create a post. Writes one post per account named, so a single call crossposts, with an optional ordered carousel from the library. It defaults to `draft`, deliberately: what this product sells is a pre-filled queue a human approves, so a caller that wants it queued has to say so. A draft is saved as `held` and goes out only once a person schedules it, never by itself. A post to a TikTok account goes to that creator's TikTok drafts when it publishes, because TikTok asks a− - `GET /posts/{id}` (member): Retrieve a post. One post by id. 404 for an id in another workspace, which is the same answer as an id that does not exist.− - `PATCH /posts/{id}` (admin): Update a post. Change the content, the time, or whether it is queued. Only a post that has not gone out can be edited. A published post is refused, because editing our row would change our record of what was published without changing what is on the platform. A change to a post on a Google Business Profile account is refused with `invalid_field` on `accountIds`, except a change to its labels alone, which touches nothing on Google: Google Business Profile posts are − - `DELETE /posts/{id}` (admin): Cancel a post. Takes the post out of the queue by setting it `held`: a draft that nothing will schedule until a person does. It is a soft cancel rather than a delete: the metrics collector and the recycler both reason about history, and a hole where a post used to be is indistinguishable from a post that never existed, and a held post can be scheduled again. A post that is already published, or being published right now, is refused with a 409. Cancelling a post th− - `GET /rivals/posts` (member): List competitor posts. What tracked competitors published, with the counts we were able to read. `title` and `excerpt` are null on a post that carried neither, so an absent excerpt is a normal row and never a missing post. A YouTube competitor’s posts are never listed here, because YouTube’s terms do not allow its data to be passed on through another API.− - `GET /analytics` (member): Read collected metrics. Three series behind one path, chosen with `?series=`: `followers` (one row per account per day it was read), `posts` (every reading of every post, each a running total) and `post_totals` (each post published in the window once, with its newest reading, account, labels and publishing date in the workspace’s time zone, the series to total posts by day, network, account or label). The first two used to come back together under one limit, which me− - `GET /analytics/worth-promoting` (member): List posts worth promoting. The workspace's own posts published in the last 7 days whose engagement (likes, comments and shares added together, or views on a network that reports none of those) is at least 2 times their account's usual and at least 10. The usual is the median of the account's posts on their earliest reading 48 to 96 hours old, over at least 12 of them; a post younger than 48 hours is compared on its newest reading, which understates i− - `GET /media` (member): List media. The workspace library. Upload in two calls: `POST /media` for a signed URL, then `POST /media/register` once the bytes are in place.− allowance the plan caps, at 402 on posts and media and 403 elsewhere, and− Three steps, because the bytes never pass through the API:− read. The Help Centre is not among them: it is closed to AI agents.− - [Pricing](https://crestnote.com/pricing): Every Crestnote plan from Free up, every limit shown, and what happens when you reach one. No sales call.− - [Features](https://crestnote.com/features): Competitor tracking, publishing, approvals, a comments inbox and reports in one workspace, with every capability listed and the plan it starts on.− - [API reference](https://crestnote.com/docs/api): Read posts and results; an admin's token writes posts.− - [Integrations](https://crestnote.com/integrations): The networks Crestnote publishes to and follows competitors on, the tools it works with, and an API and MCP server on every plan.+ > Schedule and publish social posts, read the metrics they earned, read and answer+ > the comments on them, make tracked links, and read what named competitor+ > accounts are doing, from one workspace-scoped API. There is a REST interface and+ > an MCP server, and both call the same functions, so an agent and a script always+ > see the same rows.+ otherwise publish twice to a live account. A refusal is replayed like a+ success. A 429, a `download_failed` (nothing was stored), a `state_changed`+ or a post still being saved (nothing was written) releases the key so it can+ be sent again; any other 5xx keeps it in flight for 24 hours,+ because the write may already have happened: check before retrying with a new key.+ (`billing_hold`). A write that would queue a post, or send a reply to a+ comment, answers 423 with one of those codes; a draft is still saved. Do not+ retry it: tell a person.+ - Read `GET /me` (MCP `get_workspace`) before scheduling: `workspace.time_zone`+ is the zone every date parameter is read in (the `account_days` analytics rows+ excepted, which are the network's Pacific day), `publishing.holds` says what+ keeps posts from going out and why, and `usage` what the plan has left. A+ failed payment or a pause does not refuse a post: the post is saved, does not+ go out, and the write's `warnings` says so.+ - `POST /comments/{id}/reply` sends a public reply at once and never twice, on+ Bluesky and Mastodon; replies on Instagram, Facebook and Threads are sent from Signal, in the app. It also answers 423 `publishing_paused` while publishing is+ paused for the workspace or the account, and 423 `network_stopped` while we+ have stopped that network.+ A reply whose network did not answer comes back with `delivery: "unconfirmed"`+ and the comment recorded as answered: tell a person to check the network, and+ never send it again. `GET /comments` lists a post's comments as Crestnote last+ read them (`post.comments_read_at`), on a schedule for a post's first weeks.+ Comments on YouTube and X are never listed or answered here.+ - `GET /me` (member): Describe this token and its workspace. Which workspace the token belongs to, what the token may do, and what an integration needs before it schedules: the workspace's time zone, its plan, what is holding its publishing and what the plan has left. It changes nothing, so it is the call to make when checking that a token works, and the workspace name is what an automation tool shows beside the connection. A read-only token answers `member` here and is refused by every endpoint+ - `GET /posts` (member): List posts. The queue and its history, newest scheduled time first. Filter by status to find what is waiting on a human (`awaiting_approval`), what is about to go out (`scheduled`), what did not go out (`failed`), or what already did (`published`). A post still `scheduled` more than a few minutes after its time is being held, not sent: publishing is paused for the workspace or for that account, we have suspended the workspace, the workspace is on hold while the agency it+ - `POST /posts` (admin): Create a post. Writes one post per account named, so a single call crossposts, with an optional ordered carousel from the library. It defaults to `draft`, deliberately: what this product sells is a pre-filled queue a human approves, so a caller that wants it queued has to say so. A draft is saved as `held` and goes out only once a person schedules it, never by itself. A post to a TikTok account goes to that creator's TikTok drafts when it publishes, because TikTok asks a+ - `GET /posts/{id}` (member): Retrieve a post. One post by id, with every field `GET /posts` returns for it, `last_error`, `last_error_kind` and `failed_at` included, so a failed post says why. 404 for an id in another workspace, which is the same answer as an id that does not exist.+ - `PATCH /posts/{id}` (admin): Update a post. Change the content, the time, or whether it is queued. Only a post that has not gone out can be edited. A published post is refused, because editing our row would change our record of what was published without changing what is on the platform. A change that reaches a post after its status moved (the publisher took it, a sweep moved it) is refused with `state_changed` rather than written over it. A failed payment or a pause does not refuse a move to + - `DELETE /posts/{id}` (admin): Cancel a post. Takes the post out of the queue by setting it `held`: a draft that nothing will schedule until a person does. It is a soft cancel rather than a delete: the metrics collector and the recycler both reason about history, and a hole where a post used to be is indistinguishable from a post that never existed, and a held post can be scheduled again. A post that is already published, being published right now, or whose media the network is still processing+ - `GET /free-slots` (member): Free times in the queue. The next free times in the coming 7 days to schedule a post at, soonest first, never sooner than an hour from now: the workspace's posting times (the weekly times set on Publish) that no post fills yet, as Plan my week and the composer's next free time find them. Each time is meant for one post, written to one or more of the accounts in `account_ids`: a time kept for one account is offered for that account only, one kept for a network for th+ - `GET /rivals/posts` (member): List competitor posts. What tracked competitors published, with the counts we were able to read, the form the network stated and the reading in fixed categories (never a picture or its address). `title` and `excerpt` are null on a post that carried neither, so an absent excerpt is a normal row and never a missing post. A YouTube competitor’s posts are never listed here, because YouTube’s terms do not allow its data to be passed on through another API.+ - `GET /comments` (member): List comments on your posts. Comments other people left on this workspace’s own posts on Instagram, Facebook, Threads, Bluesky and Mastodon, newest first by when Crestnote first read them, with each commenter’s name and words, the post it is on, and where it stands: `reply_state` is `unanswered`, `answered` (our words in `our_reply`, sent from Crestnote or recorded as given by hand) or `answered_on_network` (the account answered in the network’s own app). Crestnote re+ - `POST /comments/{id}/reply` (admin): Reply to a comment. Posts a public reply to one comment, at once, from the account the post went out on, on Bluesky and Mastodon, held to the network’s own length limit. Replies on the other networks this API lists are sent from Signal, in the app. A reply cannot be edited or deleted from here. It is never sent twice: the comment is held while it is sent, and one already answered here or by the account on the network, being answered right now, whose earlier+ - `POST /comments/{id}/hide` (admin): Hide or show a comment. Hides one comment from the public, or shows it again with `hidden: false`, on Bluesky. Hiding on the other networks this API lists is done from Signal, in the app. It deletes nothing, and the comment and its words stay here. Hiding twice asks the network again and keeps the time it was first hidden. A comment already deleted on the network comes back unchanged with `removed_at` set. Refused with a 409 when the post’s account is no lon+ - `GET /analytics` (member): Read collected metrics. Four series behind one path, chosen with `?series=`: `followers` (one row per account per day it was read), `posts` (every reading of every post, each a running total), `post_totals` (each post published in the window once, with its newest reading, account, labels and publishing date in the workspace’s time zone, the series to total posts by day, network, account or label) and `account_days` (one row per Instagram, Facebook or Threads account
Showing the first 40 of each.