文件预览

api.md

查看 Userorbit 技能包中的文件内容。

文件内容

references/api.md

# Userorbit API Reference

Base URL: `https://api.userorbit.com/api/v1`

All endpoints use POST. Auth via `Authorization: Bearer $USERORBIT_API_KEY` header. Optionally add `x-team-id` header for multi-team users.

## Table of Contents

- [Feedbacks](#feedbacks)
- [Feedback Boards](#feedback-boards)
- [Feedback Board Tags](#feedback-board-tags)
- [Feedback Comments](#feedback-comments)
- [Announcements](#announcements)
- [Announcement Comments](#announcement-comments)
- [Collections (Announcement Categories)](#collections)
- [Roadmaps](#roadmaps)
- [Stages](#stages)
- [Topics (Roadmap Items)](#topics)
- [Topic Comments](#topic-comments)
- [Topic Collaborators](#topic-collaborators)
- [Articles (Help Center)](#articles)
- [Article Collections](#article-collections)
- [Article Votes](#article-votes)
- [Tags](#tags)
- [Subscribers](#subscribers)
- [Projects](#projects)

---

## Feedbacks

### feedbacks.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| title | string | yes | |
| text | string | no | |
| status | string | no | Default: `in_review`. Values: `in_review`, `planned`, `in_progress`, `completed`, `closed` |
| priority | string | no | Default: `medium`. Values: `low`, `medium`, `high` |
| boardId | UUID | no | |
| tagIds | UUID[] | no | |
| assignee | UUID | no | User ID |
| creatorId | UUID | no | Subscriber ID |
| creatorName | string | no | Used if no creatorId |
| creatorEmail | string | no | Used if no creatorId |

Response: `{ data: { id, title, text, status, priority, boardId, ... } }`

### feedbacks.list

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| status | string | no | Filter by status |
| search | string | no | Full-text search |
| boardId | UUID | no | |
| sortBy | string | no | Default: `newest`. Values: `newest`, `top`, `trending` |

Response: `{ pagination: { offset, limit, total }, data: [...], count }`

### feedbacks.info

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### feedbacks.update

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | |
| title | string | no | |
| text | string | no | |
| status | string | no | |
| priority | string | no | |
| boardId | UUID | no | Set null to unassign |
| assignee | UUID | no | Set null to unassign |
| tagIds | UUID[] | no | |
| meta | object | no | |

### feedbacks.delete / feedbacks.archive / feedbacks.restore

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### feedbacks.archived

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| boardId | UUID | no | |
| sort | string | no | Default: `updatedAt` |
| direction | string | no | `ASC` or `DESC` |

### feedbacks.vote

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | Feedback ID |
| subscriberId | UUID | no | Auto-created from auth user email if omitted |

Response: `{ voted: boolean }`

---

## Feedback Boards

### feedback-boards.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| name | string | yes | |
| slug | string | no | |
| configuration | object | no | |
| public | boolean | no | Default: false |

### feedback-boards.list

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| type | string | no | `public` or `private` |
| search | string | no | |
| sortBy | string | no | Default: `name` |
| sortOrder | string | no | Default: `asc` |

### feedback-boards.info

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### feedback-boards.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| name | string | no |
| configuration | object | no |
| public | boolean | no |

### feedback-boards.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

---

## Feedback Board Tags

### feedback-board-tags.create

| Field | Type | Required |
|-------|------|----------|
| boardId | UUID | yes |
| tagId | UUID | yes |

### feedback-board-tags.list

| Field | Type | Required |
|-------|------|----------|
| boardId | UUID | yes |

### feedback-board-tags.update

| Field | Type | Required |
|-------|------|----------|
| boardId | UUID | yes |
| oldTagId | UUID | yes |
| newTagId | UUID | yes |

### feedback-board-tags.delete

| Field | Type | Required |
|-------|------|----------|
| boardId | UUID | yes |
| tagId | UUID | yes |

---

## Feedback Comments

### feedback-comments.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | Feedback ID |
| text | string | yes | |
| subscriberId | UUID | no | Auto-created from auth user if omitted |
| parentId | UUID | no | For threaded replies |
| source | string | no | Default: `admin` |
| type | string | no | Default: `public`. Values: `public`, `private` |

### feedback-comments.list

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | no | Feedback ID filter |
| sort | string | no | Default: `updatedAt` |
| direction | string | no | `ASC` or `DESC` |

### feedback-comments.update

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | Comment ID |
| text | string | yes | |
| type | string | no | `public` or `private` |

### feedback-comments.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

---

## Announcements

### announcements.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| collectionId | UUID | yes | Category ID |
| title | string | no | |
| text | string | no | Markdown content |
| meta | object | yes | `{ ctaTitle, ctaLink, ctaImage, description, feedback }` |
| publish | boolean | no | Publish immediately |
| parentAnnouncementId | UUID | no | For nested announcements |
| index | integer | no | Sort order (>= 0) |
| collaboratorIds | UUID[] | no | |

### announcements.list

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| collection | UUID | no | Collection ID filter (also accepts `category`) |
| search | string | no | |
| user | UUID | no | Filter by author |
| sort | string | no | Default: `updatedAt` |
| direction | string | no | `ASC` or `DESC` |

### announcements.info

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | conditional | One of `id` or `shareId` required |
| shareId | UUID | conditional | |

### announcements.update

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | |
| title | string | no | |
| text | string | no | |
| meta | object | no | |
| publish | boolean | no | |
| scheduledAt | ISO date | no | Set null to cancel schedule |
| sendEmailBroadcast | boolean | no | |
| collectionId | UUID | no | Move to different category |
| append | boolean | no | Append text instead of replace |
| collaboratorIds | UUID[] | no | |
| lastRevision | integer | no | Optimistic locking |

### announcements.search

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| query | string | yes | |
| collectionId | UUID | no | |
| userId | UUID | no | |
| includeArchived | string | no | `"true"` or `"false"` |
| dateFilter | string | no | `day`, `week`, `month`, `year` |

### announcements.delete / announcements.archive / announcements.pin / announcements.unpin / announcements.star / announcements.unstar

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### announcements.restore

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | |
| revisionId | UUID | no | Restore to specific revision |

### announcements.move

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | |
| collectionId | UUID | yes | Target category |
| parentAnnouncementId | UUID | no | |
| index | integer | no | |

### announcements.revisions

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### announcements.pinned / announcements.starred / announcements.drafts / announcements.archived

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| collection | UUID | no | Required for `pinned` |
| sort | string | no | |
| direction | string | no | |

---

## Announcement Comments

### announcement-comments.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | Announcement ID |
| text | string | yes | |
| subscriberId | UUID | no | |
| parentId | UUID | no | For replies |
| source | string | no | Default: `widget` |

### announcement-comments.list

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| sort | string | no |
| direction | string | no |

### announcement-comments.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| text | string | yes |

### announcement-comments.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

---

## Collections

### collections.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| name | string | yes | |
| description | string | no | |
| color | string | no | |

### collections.list

No required fields.

### collections.info

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### collections.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| name | string | no |
| description | string | no |
| color | string | no |

### collections.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

---

## Roadmaps

### roadmaps.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| name | string | yes | |
| description | string | no | |
| feedback | boolean | no | Enable feedback on roadmap |
| private | boolean | no | |
| stages | array | no | `[{ title, icon }]` to create stages inline |

### roadmaps.list

No required fields.

### roadmaps.info / roadmaps.stages / roadmaps.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### roadmaps.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| name | string | no |
| description | string | no |
| order | array | no |
| private | boolean | no |

---

## Stages

### stages.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| title | string | yes | |
| roadmapId | UUID | yes | |
| description | string | no | |
| meta | object | no | `{ icon }` |
| private | boolean | no | |

### stages.list

| Field | Type | Required |
|-------|------|----------|
| roadmapId | UUID | yes |

### stages.info / stages.delete

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | |
| force | boolean | no | (delete only) Force-delete associated topics |

### stages.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| title | string | no |
| meta | object | no |

---

## Topics

### topics.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| title | string | yes | |
| text | string | no | Markdown content |
| description | string | no | |
| roadmapId | UUID | no | |
| stageId | UUID | no | |
| meta | object | no | `{ ctaTitle, ctaLink, ctaImage, description, feedback, projectId }` |
| collaboratorIds | UUID[] | no | |
| publish | boolean | no | |

### topics.list / topics.all

| Field | Type | Required |
|-------|------|----------|
| roadmapId | UUID | yes |
| stageId | UUID | yes |

### topics.info / topics.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### topics.update

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | |
| title | string | no | |
| text | string | no | |
| stageId | UUID | no | Move to different stage |
| meta | object | no | |
| collaboratorIds | UUID[] | no | |
| publish | boolean | no | |
| private | boolean | no | |
| notifySubscribers | boolean | no | Default: true |
| recipientSubscriberIds | UUID[] | no | |

### topics.count

No required fields.

### topic-subscribers.list

| Field | Type | Required |
|-------|------|----------|
| topicId | UUID | yes |

---

## Topic Comments

### topic-comments.create

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| text | string | yes |
| subscriberId | UUID | no |
| parentId | UUID | no |
| source | string | no |

### topic-comments.list

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### topic-comments.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| text | string | yes |

### topic-comments.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

---

## Topic Collaborators

### topic-collaborators.create

| Field | Type | Required |
|-------|------|----------|
| topicId | UUID | yes |
| role | string | yes |

### topic-collaborators.list

| Field | Type | Required |
|-------|------|----------|
| topicId | UUID | yes |

### topic-collaborators.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| role | string | no |
| topicId | UUID | no |

### topic-collaborators.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

---

## Articles

### articles.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| title | string | yes | |
| text | string | yes | Markdown content |
| collectionIds | UUID[] | yes | Non-empty array |
| language | string | no | Default: `en` |
| tags | string[] | no | |
| urlSlug | string | no | Custom URL slug |
| seoTitle | string | no | |
| metaDescription | string | no | |
| authorIds | UUID[] | no | |
| assigneeIds | UUID[] | no | |

### articles.list

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| collectionId | UUID | no | |
| status | string | no | `draft`, `published`, `archived` |
| language | string | no | |
| tags | string[] | no | |
| search | string | no | |
| sort | string | no | Default: `updatedAt` |
| direction | string | no | Default: `DESC` |

### articles.info

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | conditional | ID or urlSlug |
| urlSlug | string | conditional | |

### articles.update

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | |
| title | string | no | |
| text | string | no | |
| collectionIds | UUID[] | no | |
| language | string | no | |
| tags | string[] | no | |
| urlSlug | string | no | |
| authorIds | UUID[] | no | |
| assigneeIds | UUID[] | no | |
| meta | object | no | |
| publish | boolean | no | |
| autosave | boolean | no | Default: false |

### articles.publish / articles.unpublish / articles.archive / articles.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### articles.search

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| query | string | yes | |
| collectionId | UUID | no | |
| status | string | no | Default: `published` |
| language | string | no | |
| tags | string[] | no | |

### articles.revisions

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | |
| sort | string | no | Default: `createdAt` |
| direction | string | no | Default: `DESC` |

### articles.restore

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| revisionId | UUID | yes |

---

## Article Collections

### article-collections.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| name | string | yes | |
| description | string | no | |
| icon | string | no | |
| meta | object | no | |
| privacy | string | no | Default: `public`. Values: `public`, `private` |
| parentId | UUID | no | For nested collections |
| sortOrder | integer | no | Default: 0 |

### article-collections.list

| Field | Type | Required |
|-------|------|----------|
| parentId | UUID | no |
| includeChildren | boolean | no |

### article-collections.info

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### article-collections.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| name | string | no |
| description | string | no |
| icon | string | no |
| meta | object | no |
| privacy | string | no |
| sortOrder | integer | no |

### article-collections.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

---

## Article Votes

### article-votes.info

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

Response: `{ data: { helpful, not_helpful, hasUserVoted, userVoteValue } }`

### article-votes.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| id | UUID | yes | Article ID |
| value | string | yes | `helpful` or `not_helpful` |
| comment | string | no | |

### article-votes.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

---

## Tags

### tags.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| name | string | yes | 1-50 chars |
| color | string | no | Default: `#3B82F6` |
| description | string | no | |

### tags.list

| Field | Type | Required |
|-------|------|----------|
| search | string | no |

### tags.info / tags.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### tags.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| name | string | yes |
| color | string | no |
| description | string | no |

---

## Subscribers

### subscribers.create

| Field | Type | Required |
|-------|------|----------|
| email | string | yes |
| name | string | yes |
| password | string | yes |

### subscribers.list

| Field | Type | Required |
|-------|------|----------|
| sort | string | no |
| direction | string | no |

### subscribers.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| name | string | no |
| email | string | no |

### subscribers.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### subscribers.count

No required fields. Response: `{ count: integer }`

---

## Projects

### projects.create

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| name | string | yes | |
| color | string | no | |
| description | string | no | |

### projects.list

No required fields.

### projects.info / projects.delete

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |

### projects.update

| Field | Type | Required |
|-------|------|----------|
| id | UUID | yes |
| name | string | no |
| color | string | no |
| description | string | no |

---

## Response Objects

### Feedback
```json
{
  "id": "UUID",
  "title": "string",
  "text": "string",
  "status": "in_review|planned|in_progress|completed|closed",
  "priority": "low|medium|high",
  "boardId": "UUID|null",
  "assigneeId": "UUID|null",
  "creatorId": "UUID",
  "teamId": "UUID",
  "publishedAt": "ISO date|null",
  "archivedAt": "ISO date|null",
  "createdAt": "ISO date",
  "updatedAt": "ISO date",
  "subscriber": {},
  "board": {},
  "tags": [{ "id": "", "name": "", "color": "" }]
}
```

### Announcement
```json
{
  "id": "UUID",
  "title": "string",
  "text": "string",
  "collectionId": "UUID",
  "teamId": "UUID",
  "publishedAt": "ISO date|null",
  "archivedAt": "ISO date|null",
  "scheduledAt": "ISO date|null",
  "meta": {},
  "revisionCount": 0,
  "collaboratorIds": [],
  "createdAt": "ISO date",
  "updatedAt": "ISO date",
  "createdBy": {},
  "updatedBy": {}
}
```

### Topic (Roadmap Item)
```json
{
  "id": "UUID",
  "title": "string",
  "description": "string",
  "text": "string",
  "roadmapId": "UUID",
  "stageId": "UUID",
  "creatorId": "UUID",
  "publishedAt": "ISO date|null",
  "meta": {},
  "collaboratorIds": [],
  "createdAt": "ISO date",
  "updatedAt": "ISO date",
  "votes_count": 0
}
```

### Article (Help Center)
```json
{
  "id": "UUID",
  "title": "string",
  "text": "string",
  "status": "draft|published|archived",
  "language": "en",
  "tags": [],
  "urlSlug": "string",
  "seoTitle": "string|null",
  "metaDescription": "string|null",
  "publishedAt": "ISO date|null",
  "createdAt": "ISO date",
  "updatedAt": "ISO date",
  "collections": [],
  "authors": [],
  "assignees": []
}
```

### Subscriber
```json
{
  "id": "UUID",
  "email": "string",
  "name": "string",
  "teamId": "UUID",
  "source": "string",
  "createdAt": "ISO date",
  "updatedAt": "ISO date"
}
```