v1Resources/Post Ideas

Post Ideas

Read, create, and publish drafted post ideas awaiting review, and publish them as real posts.

Returns post ideas in one of three modes: pass locationId for a single location's grid (paginated); pass clientId with scope=locations for the roll-up of location-scoped ideas across a client's locations; or pass clientId with scope=brand for that client's brand-level ideas.

List post ideas

get/api/v1/post-ideas
ideas:read
Query parameters
locationIdstringoptional
List ideas for this location (paginated mode).
clientIdstringoptional
List ideas for this client. Requires scope.
scopestring (locations | brand)optional
Which client-level idea set to return: locations (roll-up across the client's locations) or brand (brand-level ideas).
bucketstring (idea | holiday | calendar | series)optional
Restrict results to one bucket (locationId mode only).
statusstringoptional
Restrict results to one status, or "archived" to list archived ideas instead (locationId mode only).
seriesIdstringoptional
Restrict results to ideas in this content series (locationId mode only).
searchstringoptional
Case-insensitive match against the idea's title (locationId mode only).
pageintegeroptional
Page number, starting at 1. Defaults to 1 (locationId mode only).
perPageintegeroptional
Results per page, up to 50. Defaults to 20 (locationId mode only).
includeRejectedbooleanoptional
Include ideas rejected during approval. Defaults to false (clientId modes only).
Response
dataobjectoptional
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/post-ideas
Your API key
locationId
clientId
scope
bucket
status
seriesId
search
page
perPage
includeRejected
{
  "data": {
    "rows": [
      {
        "id": "cm_idea_abc123",
        "agencyId": "cm_agency_1",
        "locationId": "cm_loc_1",
        "clientLocationId": "cm_loc_1",
        "clientId": null,
        "brandName": null,
        "agentMeta": null,
        "title": "Spotlight our new patient special",
        "content": "Book this month and get 20% off your first cleaning!",
        "imagePrompt": null,
        "imageUrl": null,
        "type": "announcement",
        "status": "draft",
        "bucket": "idea",
        "platforms": [
          "google",
          "facebook"
        ],
        "seriesId": null,
        "scheduledDate": null,
        "scheduledTime": null,
        "observanceName": null,
        "observanceDate": null,
        "generationBatchId": null,
        "generationJobId": null,
        "isUserGenerated": true,
        "source": "os",
        "externalId": "cm_idea_abc123",
        "reviewStatus": null,
        "archived": false,
        "archivedAt": null,
        "createdAt": "2026-01-20T09:00:00.000Z",
        "updatedAt": "2026-01-20T09:00:00.000Z"
      }
    ],
    "total": 1,
    "page": 1,
    "perPage": 20,
    "counts": [
      {
        "bucket": "idea",
        "_count": {
          "id": 4
        }
      }
    ]
  }
}
v1Resources/Post Ideas/postCreate a post idea

Creates (or, for a repeated externalId, updates) a draft post idea, awaiting review or ready to publish.

Create a post idea

post/api/v1/post-ideas
ideas:write
Request body
locationIdstringoptional
The location this idea is for, or omit for a brand-level idea.
clientIdstringoptional
The client this idea is for (brand-level ideas).
titlestringrequired
The idea's title. Required on create.
contentstringoptional
The idea's caption/body content.
externalIdstringrequired
A stable id you control — retrying a create with the same externalId updates the existing idea instead of duplicating it. Required on create.
originstring (channel | routine | os_button)required
Where this idea is coming from: channel, routine, or os_button. Required on create.
typestring (announcement | offer | tip | showcase | story | event)optional
Idea type.
bucketstring (idea | holiday | calendar | series)optional
Which grid bucket the idea sits in.
platformsarray of stringoptional
Platforms this idea is intended for.
imageUrlstringoptional
URL of an image to attach to the idea.
imagePromptstringoptional
The prompt used to generate the idea's image.
seriesIdstringoptional
ID of the content series to attach this idea to.
scheduledDatestringoptional
Planned publish date (YYYY-MM-DD).
scheduledTimestringoptional
Planned publish time.
generationJobIdstringoptional
ID of the AI generation job that produced this idea, if any.
Response
dataobjectoptional
idstringoptional
Unique identifier for the post idea.
createdbooleanoptional
Whether this call created a new idea (false if an idea with this externalId already existed and was updated instead).
reviewStatusstringoptional
Approval gate: null (no gate), pending, approved, or rejected.
statusstringoptional
Idea status: draft, published, or archived.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
422The request is missing a required parameter or is otherwise malformed.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/post-ideas
Your API key
Request body*
{
  "data": {
    "id": "cm_idea_abc123",
    "created": true,
    "reviewStatus": null,
    "status": "draft"
  }
}
v1Resources/Post Ideas/getGet a post idea

Returns a single post idea. id accepts either its own id or the external id it was created with.

Get a post idea

get/api/v1/post-ideas/{id}
ideas:read
Query parameters
idstringrequired
The post idea to look up — its id or externalId.
Response
dataobjectoptional
idstringoptional
Unique identifier for the post idea.
locationIdstringoptional
ID of the location this idea belongs to, or null for a brand-level idea.
clientLocationIdstringoptional
Resolved location record id, or null.
clientIdstringoptional
ID of the client this idea belongs to (brand-level ideas), or null.
brandNamestringoptional
Brand profile display name, for brand-level ideas, or null.
titlestringoptional
The idea's title.
contentstringoptional
The idea's caption/body content.
imageUrlstringoptional
URL of the idea's image, or null.
imagePromptstringoptional
The prompt used to generate the idea's image, or null.
typestring (announcement | offer | tip | showcase | story | event)optional
Idea type: announcement, offer, tip, showcase, story, or event.
statusstring (draft | published | archived)optional
Idea status: draft, published, or archived.
bucketstring (idea | holiday | calendar | series)optional
Which grid bucket the idea sits in: idea, holiday, calendar, or series.
platformsarray of stringoptional
Platforms this idea is intended for.
seriesIdstringoptional
ID of the content series this idea belongs to, or null.
scheduledDatestringoptional
Planned publish date (YYYY-MM-DD), or null.
scheduledTimestringoptional
Planned publish time, or null.
externalIdstringoptional
Stable id this idea was created with, if it came from an external source.
sourcestring (os | agent)optional
Where the idea came from: os (created in Synup) or agent (pushed by an AI agent).
reviewStatusstring (pending | approved | rejected)optional
Approval gate: null (no gate), pending, approved, or rejected.
generationJobIdstringoptional
ID of the AI generation job that produced this idea, if any, or null.
isUserGeneratedbooleanoptional
Whether a person (rather than an agent) created this idea.
archivedbooleanoptional
Whether this idea has been archived.
archivedAtstringoptional
When this idea was archived, as an ISO 8601 timestamp, or null.
createdAtstringoptional
When this idea was created, as an ISO 8601 timestamp.
updatedAtstringoptional
When this idea was last updated, as an ISO 8601 timestamp.
locationNamestringoptional
Display name of the idea's location. Only present when listing a client's location-scoped ideas.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/post-ideas/{id}
Your API key
id *
{
  "data": {
    "id": "cm_idea_abc123",
    "agencyId": "cm_agency_1",
    "locationId": "cm_loc_1",
    "clientLocationId": "cm_loc_1",
    "clientId": null,
    "brandName": null,
    "agentMeta": null,
    "title": "Spotlight our new patient special",
    "content": "Book this month and get 20% off your first cleaning!",
    "imagePrompt": null,
    "imageUrl": null,
    "type": "announcement",
    "status": "draft",
    "bucket": "idea",
    "platforms": [
      "google",
      "facebook"
    ],
    "seriesId": null,
    "scheduledDate": null,
    "scheduledTime": null,
    "observanceName": null,
    "observanceDate": null,
    "generationBatchId": null,
    "generationJobId": null,
    "isUserGenerated": true,
    "source": "os",
    "externalId": "cm_idea_abc123",
    "reviewStatus": null,
    "archived": false,
    "archivedAt": null,
    "createdAt": "2026-01-20T09:00:00.000Z",
    "updatedAt": "2026-01-20T09:00:00.000Z"
  }
}
v1Resources/Post Ideas/patchUpdate a post idea

Updates a post idea's editable fields. id accepts either its own id or the external id it was created with.

Update a post idea

patch/api/v1/post-ideas/{id}
ideas:write
Query parameters
idstringrequired
The post idea to update — its id or externalId.
Request body
titlestringoptional
The idea's title. Required on create.
contentstringoptional
The idea's caption/body content.
imageUrlstringoptional
URL of an image to attach to the idea.
imagePromptstringoptional
The prompt used to generate the idea's image.
typestring (announcement | offer | tip | showcase | story | event)optional
Idea type.
statusstring (draft | published | archived)optional
Idea status.
platformsarray of stringoptional
Platforms this idea is intended for.
scheduledDatestringoptional
Planned publish date (YYYY-MM-DD).
scheduledTimestringoptional
Planned publish time.
Response
dataobjectoptional
idstringoptional
Unique identifier for the post idea.
locationIdstringoptional
ID of the location this idea belongs to, or null for a brand-level idea.
clientLocationIdstringoptional
Resolved location record id, or null.
clientIdstringoptional
ID of the client this idea belongs to (brand-level ideas), or null.
brandNamestringoptional
Brand profile display name, for brand-level ideas, or null.
titlestringoptional
The idea's title.
contentstringoptional
The idea's caption/body content.
imageUrlstringoptional
URL of the idea's image, or null.
imagePromptstringoptional
The prompt used to generate the idea's image, or null.
typestring (announcement | offer | tip | showcase | story | event)optional
Idea type: announcement, offer, tip, showcase, story, or event.
statusstring (draft | published | archived)optional
Idea status: draft, published, or archived.
bucketstring (idea | holiday | calendar | series)optional
Which grid bucket the idea sits in: idea, holiday, calendar, or series.
platformsarray of stringoptional
Platforms this idea is intended for.
seriesIdstringoptional
ID of the content series this idea belongs to, or null.
scheduledDatestringoptional
Planned publish date (YYYY-MM-DD), or null.
scheduledTimestringoptional
Planned publish time, or null.
externalIdstringoptional
Stable id this idea was created with, if it came from an external source.
sourcestring (os | agent)optional
Where the idea came from: os (created in Synup) or agent (pushed by an AI agent).
reviewStatusstring (pending | approved | rejected)optional
Approval gate: null (no gate), pending, approved, or rejected.
generationJobIdstringoptional
ID of the AI generation job that produced this idea, if any, or null.
isUserGeneratedbooleanoptional
Whether a person (rather than an agent) created this idea.
archivedbooleanoptional
Whether this idea has been archived.
archivedAtstringoptional
When this idea was archived, as an ISO 8601 timestamp, or null.
createdAtstringoptional
When this idea was created, as an ISO 8601 timestamp.
updatedAtstringoptional
When this idea was last updated, as an ISO 8601 timestamp.
locationNamestringoptional
Display name of the idea's location. Only present when listing a client's location-scoped ideas.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
patch/api/v1/post-ideas/{id}
Your API key
id *
Request body
{
  "data": {
    "id": "cm_idea_abc123",
    "agencyId": "cm_agency_1",
    "locationId": "cm_loc_1",
    "clientLocationId": "cm_loc_1",
    "clientId": null,
    "brandName": null,
    "agentMeta": null,
    "title": "Spotlight our new patient special (updated)",
    "content": "Book this month and get 25% off your first cleaning!",
    "imagePrompt": null,
    "imageUrl": null,
    "type": "announcement",
    "status": "draft",
    "bucket": "idea",
    "platforms": [
      "google",
      "facebook"
    ],
    "seriesId": null,
    "scheduledDate": null,
    "scheduledTime": null,
    "observanceName": null,
    "observanceDate": null,
    "generationBatchId": null,
    "generationJobId": null,
    "isUserGenerated": true,
    "source": "os",
    "externalId": "cm_idea_abc123",
    "reviewStatus": null,
    "archived": false,
    "archivedAt": null,
    "createdAt": "2026-01-20T09:00:00.000Z",
    "updatedAt": "2026-01-20T09:05:00.000Z"
  }
}
v1Resources/Post Ideas/deleteArchive a post idea

Soft-deletes (archives) a post idea. id accepts either its own id or the external id it was created with.

Archive a post idea

delete/api/v1/post-ideas/{id}
ideas:write
Query parameters
idstringrequired
The post idea to archive — its id or externalId.
Response
dataobjectoptional
idstringoptional
Unique identifier for the post idea.
archivedbooleanoptional
Whether this idea has been archived.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
delete/api/v1/post-ideas/{id}
Your API key
id *
{
  "data": {
    "id": "cm_idea_abc123",
    "archived": true
  }
}
v1Resources/Post Ideas/postPublish a post idea

Publishes a post idea as a real post, submitting it to its target platforms. Unless scheduledFor or draft is set, this sends real content live immediately. id accepts either the idea's own id or the external id it was created with.

Publish a post idea

post/api/v1/post-ideas/{id}/publish
posts:write
Query parameters
idstringrequired
The post idea to publish — its id or externalId.
Request body
scheduledForstringoptional
Publish at this future ISO 8601 timestamp instead of immediately.
draftbooleanoptional
Save as a draft post instead of publishing immediately.
Response
dataobjectoptional
A requested platform with no active connection, or a field the idea needs before it can go live, never fails this call — the idea is saved as a draft post instead. Calling this again for an idea that already has a post returns alreadyPublished: true rather than creating a second one.
postIdstringoptional
ID of the post this idea published as, or null if publishing didn't complete.
statusstringoptional
Idea status: draft, published, or archived.
ideaIdstringoptional
ID of the post idea that was published.
alreadyPublishedbooleanoptional
Whether this idea already had a post from an earlier call — when true, nothing new was published.
missingFieldsarray of stringoptional
Fields still needed before the resulting post can go live, if any.
missingPlatformsarray of stringoptional
Requested platforms with no active connection, if any.
scopestring (location | client)optional
Whether the connection/field gap applies at the location or client level.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
422The request is missing a required parameter or is otherwise malformed.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/post-ideas/{id}/publish
Your API key
id *
Request body
{
  "data": {
    "postId": "cm_post_xyz789",
    "status": "scheduled",
    "ideaId": "cm_idea_abc123"
  }
}