AntNexo

Developers

The AntNexo API

Read and write your workspace's feedback from your own code: posts, votes, comments, customers, the roadmap and the changelog. Webhooks tell you when something happens.

New here? Start with the getting-started guide →
Base URL
https://app.antnexo.com/api/v1/ext
Authentication
Send a workspace API key (Settings → Developers) as Authorization: Bearer anx_…. A missing, unknown or revoked key is 401; a read key on a write is 403 scope_required. Your workspace's keys share its plan's requests per minute: every answer carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, and past the limit you get 429 rate_limited with Retry-After. Within v1 the API only grows: ignore fields and values you don't know.
Errors
Errors are RFC 9457 problem+json: status, title, a code you can match on (like scope_required, rate_limited, invalid_cursor, id_conflict, plan_required), a detail and the request_id to quote when you write to us. A body that fails validation also lists the fields.

Me

GET/api/v1/ext/meRead key

The key's workspace, scope and rate limit; a cheap check that a key works

Responses

  • 200 Who the key speaks for · ExtMe
  • 429 Rate limited · Problem
  • default An error (RFC 9457) · Problem

Boards

GET/api/v1/ext/boardsRead key

Every live board, public, private and inbox; one page

Responses

GET/api/v1/ext/boards/{board_id}Read key

One board

Parameters

  • board_id (path, uuid, required)

Responses

Posts

GET/api/v1/ext/postsRead key

Posts on every board, newest first or by votes. Merged and spam posts only with include

Parameters

  • cursor (query, string, optional) — Opaque; the previous page's next_cursor. Omit it for the first page; a cursor of another list is 400 invalid_cursor.
  • limit (query, integer, optional)
  • board_id (query, uuid, optional)
  • status (query, list of string, optional) — Any of these (repeat the parameter)
  • category (query, string, optional)
  • initiative_id (query, uuid, optional)
  • author_email (query, string, optional)
  • q (query, string, optional) — Text in the title or body
  • created_after (query, date-time, optional)
  • updated_after (query, date-time, optional) — Changed after this time (a sync: pass the last run's start)
  • sort (query, string: newest | top, optional)
  • include (query, list of string, optional)

Responses

POST/api/v1/ext/postsWrite key

File a post for a customer (idempotent by id): the author is made or updated by email and votes for it; source api, triaged as a customer's post. Any board; an inbox board needs the plan (403 plan_required)

Request body

ExtPostCreate

Responses

  • 200 Already there (a retry, or a known person updated) · ExtPost
  • 201 Created · ExtPost
  • 429 Rate limited · Problem
  • default An error (RFC 9457) · Problem
GET/api/v1/ext/posts/{post_id}Read key

One post; a merged one has merged_into_id set

Parameters

  • post_id (path, uuid, required)

Responses

PATCH/api/v1/ext/posts/{post_id}Write key

Change a post's status, category or initiative; followers hear of a status change as from the admin. If-Match (the version) is optional; a stale one is 412

Parameters

  • post_id (path, uuid, required)
  • If-Match (header, string, optional)

Request body

ExtPostUpdate

Responses

Votes

GET/api/v1/ext/posts/{post_id}/votesRead key

The customers who voted for the post, earliest first (the team's own votes aren't listed)

Parameters

  • post_id (path, uuid, required)
  • cursor (query, string, optional) — Opaque; the previous page's next_cursor. Omit it for the first page; a cursor of another list is 400 invalid_cursor.
  • limit (query, integer, optional)

Responses

POST/api/v1/ext/posts/{post_id}/votesWrite key

Add a customer's vote by their email (made or updated, as /ext/users); theirs, not the team's. 422 inbox_post on an inbox post, 409 post_merged on a merged one

Parameters

  • post_id (path, uuid, required)

Request body

ExtVoteInput

Responses

DELETE/api/v1/ext/posts/{post_id}/votes/{user_id}Write key

Take an end user's vote back; 204 also when there was none

Parameters

  • post_id (path, uuid, required)
  • user_id (path, uuid, required)

Responses

  • 204 Gone
  • 429 Rate limited · Problem
  • default An error (RFC 9457) · Problem

Comments

GET/api/v1/ext/posts/{post_id}/commentsRead key

The post's comments, oldest first, internal notes included

Parameters

  • post_id (path, uuid, required)
  • cursor (query, string, optional) — Opaque; the previous page's next_cursor. Omit it for the first page; a cursor of another list is 400 invalid_cursor.
  • limit (query, integer, optional)

Responses

POST/api/v1/ext/posts/{post_id}/commentsWrite key

Write a comment (idempotent by id). A member's address makes it the team's (internal allowed); any other is the customer's, made or updated by email, only on a post the public sees (403 not_allowed otherwise) and never internal

Parameters

  • post_id (path, uuid, required)

Request body

ExtCommentCreate

Responses

Users

GET/api/v1/ext/usersRead key

The end user with this email, if any (a list of zero or one)

Parameters

  • email (query, string, required)

Responses

POST/api/v1/ext/usersWrite key

Make or update the end user with this email (201 new, 200 known: the fields given win, the rest stay); made verified

Request body

ExtUserInput

Responses

  • 200 Already there (a retry, or a known person updated) · ExtUser
  • 201 Created · ExtUser
  • 429 Rate limited · Problem
  • default An error (RFC 9457) · Problem
GET/api/v1/ext/users/{user_id}Read key

One end user; 404 once erased

Parameters

  • user_id (path, uuid, required)

Responses

Initiatives

GET/api/v1/ext/initiativesRead key

Every initiative (the backlog and the roadmap); one page

Responses

GET/api/v1/ext/initiatives/{initiative_id}Read key

One initiative

Parameters

  • initiative_id (path, uuid, required)

Responses

Changelog

GET/api/v1/ext/changelogRead key

Changelog entries, drafts first (newest edited), then published (newest first)

Parameters

  • cursor (query, string, optional) — Opaque; the previous page's next_cursor. Omit it for the first page; a cursor of another list is 400 invalid_cursor.
  • limit (query, integer, optional)
  • state (query, string: draft | published, optional)

Responses

POST/api/v1/ext/changelogWrite key

Write a changelog draft (idempotent by id); publishing stays in the admin, as it emails customers

Request body

ExtChangelogCreate

Responses

GET/api/v1/ext/changelog/{entry_id}Read key

One changelog entry

Parameters

  • entry_id (path, uuid, required)

Responses

Schemas

ExtAuthor

FieldType
emailstringrequired
iduuidrequired · The end user (see /ext/users)
namestring or nullrequired

ExtBoard

FieldType
categorieslist of stringrequired
created_atdate-timerequired
iduuidrequired
namestringrequired
slugstringrequired
urlstring or nullrequired · The board's page; null for private and inbox boards
visibilitystringrequired · One of public, private, inbox · public: anyone sees it; private: the team only; inbox: anyone posts, only the team reads

ExtBoardList

FieldType
itemslist of ExtBoardrequired
next_cursorstring or nullrequired · Pass it as cursor for the next page; null on the last one

ExtChangelogCreate

FieldType
bodystringrequired · Markdown
iduuidrequired
initiative_idslist of uuidoptional
titlestringrequired

ExtChangelogEntry

FieldType
bodystringrequired · Markdown
created_atdate-timerequired
iduuidrequired
initiative_idslist of uuidrequired
published_atdate-time or nullrequired
statestringrequired · One of draft, published
titlestringrequired
updated_atdate-timerequired
urlstring or nullrequired · The board's changelog page; null for drafts

ExtChangelogList

FieldType
itemslist of ExtChangelogEntryrequired
next_cursorstring or nullrequired · Pass it as cursor for the next page; null on the last one

ExtComment

FieldType
authorExtCommentAuthor or nullrequired · Null once the author deleted their account or erased their data
bodystringrequired
created_atdate-timerequired
iduuidrequired
internalbooleanrequired · A note only the team sees
parent_iduuid or nullrequired
post_iduuidrequired

ExtCommentAuthor

FieldType
emailstringrequired
namestring or nullrequired
typestringrequired · One of member, customer · member: the team; customer: an end user

ExtCommentCreate

FieldType
authorExtUserInputrequired
bodystringrequired
iduuidrequired · Client-generated (UUID v7)
internalbooleanoptional · A note only the team sees; members only
parent_iduuidoptional · The comment this one answers

ExtCommentList

FieldType
itemslist of ExtCommentrequired
next_cursorstring or nullrequired · Pass it as cursor for the next page; null on the last one

ExtInitiative

FieldType
columnstringrequired · One of backlog, next, now, done · backlog: the team's only; next, now, done: also on the public roadmap
created_atdate-timerequired
iduuidrequired
linkslist of ExtTrackerLinkrequired · Links to work items in a tracker, oldest first
post_countintegerrequired
summarystringrequired
titlestringrequired
updated_atdate-timerequired
vote_countintegerrequired

ExtInitiativeList

FieldType
itemslist of ExtInitiativerequired
next_cursorstring or nullrequired · Pass it as cursor for the next page; null on the last one

ExtKey

FieldType
iduuidrequired
namestringrequired
scopestringrequired · One of read, write · read reads everything; write also creates and changes

ExtMe

FieldType
keyExtKeyrequired
rate_limitintegerrequired · Requests per minute the workspace's keys may make together (its plan's limit)
workspaceExtWorkspacerequired

ExtPost

FieldType
authorExtAuthor or nullrequired · Null for a guest post or once the author erased their data
board_iduuidrequired
bodystringrequired
categorystring or nullrequired
comment_countintegerrequired
created_atdate-timerequired
iduuidrequired
initiative_iduuid or nullrequired
merged_into_iduuid or nullrequired · The post this one was merged into
sourcestringrequired · Where it came from: board, widget, api, team, support, guest… (new values may appear)
statusstringrequired · One of open, under_review, planned, in_progress, done, closed
titlestringrequired
triagestringrequired · One of new, accepted, spam · new: waits in the inbox; accepted: the team kept it; spam
updated_atdate-timerequired
urlstring or nullrequired · The post's page on the board; null on private and inbox boards
versionintegerrequired · Changes with every edit
vote_countintegerrequired

ExtPostCreate

FieldType
authorExtUserInputrequired
board_iduuidrequired
bodystringoptional
categorystringoptional · One of the board's categories
iduuidrequired · Client-generated (UUID v7); a retry with it returns the post
titlestringrequired

ExtPostList

FieldType
itemslist of ExtPostrequired
next_cursorstring or nullrequired · Pass it as cursor for the next page; null on the last one

ExtPostUpdate

FieldType
categorystringoptional · One of the board's categories; "" clears it
initiative_idstringoptional · An initiative's id; "" takes the post off its initiative
statusstringoptional · One of open, under_review, planned, in_progress, done, closed

ExtTrackerLinkCreate

FieldType
iduuidrequired · Client-generated (UUID v7)
keystringoptional · Like SPL-1234
titlestringoptional
urlstringrequired · An https address

ExtUser

FieldType
companystring or nullrequired
created_atdate-timerequired
emailstringrequired
iduuidrequired
mrrnumber or nullrequired · Monthly revenue from this customer, as you set it
namestring or nullrequired

ExtUserInput

FieldType
companystringoptional
emailstringrequired
mrrnumberoptional · Monthly revenue from this customer
namestringoptional

ExtUserList

FieldType
itemslist of ExtUserrequired
next_cursorstring or nullrequired · Pass it as cursor for the next page; null on the last one

ExtVote

FieldType
created_atdate-timerequired
userExtAuthorrequired

ExtVoteList

FieldType
itemslist of ExtVoterequired
next_cursorstring or nullrequired · Pass it as cursor for the next page; null on the last one

ExtVoteResult

FieldType
post_iduuidrequired
userExtAuthorrequired
vote_countintegerrequired

ExtWorkspace

FieldType
iduuidrequired
namestringrequired
slugstringrequired

FieldError

FieldType
fieldstringrequired
messagestringrequired

Problem

FieldType
codestringoptional · Stable machine-readable reason, e.g. invalid_code, slug_taken, stale
detailstringoptional
errorslist of FieldErroroptional
redirect_tostringoptional · Where to send the browser instead of showing this error (an AI assistant's authorization request)
request_idstringoptional
statusintegerrequired
titlestringrequired
typestringrequired