API reference

Hashtag sets

7 endpoints, served at https://orbitwrite.com/api/v1. Each one lists the credentials it accepts, its parameters and every response it can give.

List a workspace's hashtag sets#

GET/api/v1/hashtag-sets

Requires hashtagSet:read. Every saved set, sorted by name — the list the composer's Hashtags panel inserts from.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200HashtagSetList

The workspace's hashtag sets

Response attributes
hashtagSetsHashtagSet[]Required
Child attributes
idstringRequired
namestringRequired
hashtagsstring[]Required

Without the leading #, in the order the set was saved. Write them into a post as #tag.

createdAtstringRequired
updatedAtstringRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/hashtag-sets
curl -X GET "https://orbitwrite.com/api/v1/hashtag-sets" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "hashtagSets": [
    {
      "id": "string",
      "name": "string",
      "hashtags": [
        "string"
      ],
      "createdAt": "string",
      "updatedAt": "string"
    }
  ]
}

Save a hashtag set#

POST/api/v1/hashtag-sets

Requires hashtagSet:create. Tags may be sent with or without the leading # and are stored without it. A tag with characters no platform links as part of a hashtag (a hyphen, an emoji), an all-digit tag, or a repeat is a 400 naming it — never silently dropped. Set names are unique per workspace, case-insensitively (409).

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Body application/json

namestringRequired

Between 1 and 60 characters.

hashtagsstring[]Required

Up to 30 tags, with or without the leading #. Letters, digits and underscores only; stored without the #.

Between 1 and 30 items.

Responses

201HashtagSetResult

The set as stored

Response attributes
hashtagSetHashtagSetRequired
Child attributes
idstringRequired
namestringRequired
hashtagsstring[]Required

Without the leading #, in the order the set was saved. Write them into a post as #tag.

createdAtstringRequired
updatedAtstringRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
409Error

Conflicts with an existing resource

Response attributes
errorstringRequired
issuesany[]
POST /api/v1/hashtag-sets
curl -X POST "https://orbitwrite.com/api/v1/hashtag-sets" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "hashtags": [
    "string"
  ]
}'
Response
{
  "hashtagSet": {
    "id": "string",
    "name": "string",
    "hashtags": [
      "string"
    ],
    "createdAt": "string",
    "updatedAt": "string"
  }
}

Read one hashtag set#

GET/api/v1/hashtag-sets/{id}

Requires hashtagSet:read.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Path parameters

idstringRequired

At least 1 character.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200HashtagSetResult

The set as stored

Response attributes
hashtagSetHashtagSetRequired
Child attributes
idstringRequired
namestringRequired
hashtagsstring[]Required

Without the leading #, in the order the set was saved. Write them into a post as #tag.

createdAtstringRequired
updatedAtstringRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/hashtag-sets/{id}
curl -X GET "https://orbitwrite.com/api/v1/hashtag-sets/{id}" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "hashtagSet": {
    "id": "string",
    "name": "string",
    "hashtags": [
      "string"
    ],
    "createdAt": "string",
    "updatedAt": "string"
  }
}

Rename a hashtag set or replace its tags#

PATCH/api/v1/hashtag-sets/{id}

Requires hashtagSet:update. An omitted field is left alone; hashtags, when sent, replaces the whole list (same rules as create). Posts the set was already inserted into keep their text.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Path parameters

idstringRequired

At least 1 character.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Body application/json

namestring

Between 1 and 60 characters.

hashtagsstring[]

Between 1 and 30 items.

Responses

200HashtagSetResult

The set as stored

Response attributes
hashtagSetHashtagSetRequired
Child attributes
idstringRequired
namestringRequired
hashtagsstring[]Required

Without the leading #, in the order the set was saved. Write them into a post as #tag.

createdAtstringRequired
updatedAtstringRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
409Error

Conflicts with an existing resource

Response attributes
errorstringRequired
issuesany[]
PATCH /api/v1/hashtag-sets/{id}
curl -X PATCH "https://orbitwrite.com/api/v1/hashtag-sets/{id}" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "hashtags": [
    "string"
  ]
}'
Response
{
  "hashtagSet": {
    "id": "string",
    "name": "string",
    "hashtags": [
      "string"
    ],
    "createdAt": "string",
    "updatedAt": "string"
  }
}

Delete a hashtag set#

DELETE/api/v1/hashtag-sets/{id}

Requires hashtagSet:delete. Posts the set was inserted into keep their text.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Path parameters

idstringRequired

At least 1 character.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

204

The set was deleted

400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
DELETE /api/v1/hashtag-sets/{id}
curl -X DELETE "https://orbitwrite.com/api/v1/hashtag-sets/{id}" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "error": "string",
  "issues": []
}

Add a hashtag set to a post's text#

POST/api/v1/hashtag-sets/{id}/apply

Requires hashtagSet:read. Returns text with the set added the way the composer's Insert does it: tags the text already has are skipped, and with a platform the platform's ceiling is respected (Instagram's 5, Threads' one topic tag, YouTube's 60). Saves nothing — write the returned text into the post with POST /posts or /posts/draft, where the post's own rules still apply. An unknown platform is a 400 rather than a silent "no ceiling".

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Path parameters

idstringRequired

At least 1 character.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Body application/json

textstringRequired

The post text to add the set to. Empty is fine — the result is just the tags.

At most 100000 characters.

platformstring

The platform the text is for (a channel's platform, e.g. instagram). Sets the hashtag ceiling; omit for no ceiling.

At least 1 character.

Responses

200HashtagSetApplyResult

The text with the set applied, and what was skipped

Response attributes
textstringRequired

The text with the inserted tags appended as a closing paragraph. Unchanged when none fit.

insertstring[]Required

Tags that were added, without the #.

alreadyPresentstring[]Required

Tags the text already carried (case-insensitively), so skipped.

overLimitstring[]Required

Tags left out because the platform's hashtag ceiling was reached.

400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
POST /api/v1/hashtag-sets/{id}/apply
curl -X POST "https://orbitwrite.com/api/v1/hashtag-sets/{id}/apply" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "text": "string"
}'
Response
{
  "text": "string",
  "insert": [
    "string"
  ],
  "alreadyPresent": [
    "string"
  ],
  "overLimit": [
    "string"
  ]
}

Hashtag limits and tips per platform#

GET/api/v1/hashtags/guidance

Every platform's hashtag ceiling and conventions, the platforms where hashtags matter first. With platform (any channel platform value, e.g. linkedin_page), just that one — an empty list when there is nothing to say. Needs any credential and no workspace.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Query parameters

platformstring

At least 1 character.

Responses

200HashtagGuidanceList

The guidance

Response attributes
platformsHashtagGuidance[]Required
Child attributes
platformstringRequired

Canonical key — linkedin covers LinkedIn profiles and pages.

displayNamestringRequired
linksHashtagsbooleanRequired

Whether a #tag does anything there. False for Discord and Slack, which publish it as plain text.

limitHashtagLimit | any | nullRequired
Child attributes
maxintegerRequired
beyondstringRequired

rejected: the platform refuses a post over max (and so does POST /posts). ignored: it publishes, but the surplus does nothing.

  • "rejected"
  • "ignored"
tipsstring[]Required
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/hashtags/guidance
curl -X GET "https://orbitwrite.com/api/v1/hashtags/guidance" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "platforms": [
    {
      "platform": "string",
      "displayName": "string",
      "linksHashtags": true,
      "limit": {
        "max": 0,
        "beyond": "rejected"
      },
      "tips": [
        "string"
      ]
    }
  ]
}