/ opencodehub / docs / api / rest-api.md
Swadhin Biswas feat: production readiness — fix critical bugs, achieve 100% test pass rate, complete documentation · 4/30/2026
ac8f8cc
671 lines · 9.5 KB
Raw Download

REST API Reference

OpenCodeHub provides a comprehensive REST API with 140+ endpoints for interacting with repositories, users, pull requests, issues, and more programmatically.

  • Base URL: /api
  • Authentication: Bearer Token or Personal Access Token (see Authentication)
  • Response Format: JSON with standard { success, data, meta? } wrapper
  • Rate Limit: 100 requests/minute (authenticated), 20/minute (unauthenticated)

Users

Get Current User

GET /api/user

Response:

{
  "success": true,
  "data": {
    "id": "usr_123abc",
    "username": "johndoe",
    "email": "[email protected]",
    "displayName": "John Doe",
    "avatarUrl": "/uploads/avatars/usr_123.jpg",
    "bio": "Full-stack developer",
    "location": "San Francisco",
    "website": "https://johndoe.dev",
    "company": "Acme Inc",
    "isAdmin": false,
    "createdAt": "2024-01-01T00:00:00Z"
  }
}

Get / Update / Delete Profile

GET    /api/auth/me
PATCH  /api/auth/me
DELETE /api/auth/me

PATCH Body:

{
  "displayName": "John Doe",
  "bio": "Updated bio",
  "location": "New York",
  "website": "https://example.com",
  "company": "New Co"
}

Repositories

List Repositories

GET /api/repos?page=1&per_page=20

Response:

{
  "success": true,
  "data": [
    {
      "id": "repo_789xyz",
      "owner": "johndoe",
      "name": "awesome-project",
      "visibility": "public",
      "description": "My awesome project",
      "updatedAt": "2024-03-15T10:00:00Z"
    }
  ],
  "meta": {
    "page": 1,
    "perPage": 20,
    "total": 45,
    "totalPages": 3
  }
}

Create Repository

POST /api/repos

Body:

{
  "name": "new-project",
  "visibility": "private",
  "description": "Optional description",
  "init": true
}

Get Repository Details

GET /api/repos/{owner}/{repo}

Update Repository

PATCH /api/repos/{owner}/{repo}

Body:

{
  "description": "Updated description",
  "visibility": "public",
  "defaultBranch": "main"
}

Delete Repository

DELETE /api/repos/{owner}/{repo}

Issues

List Issues

GET /api/repos/{owner}/{repo}/issues?state=open&page=1

Query Parameters:

Name Type Description
state string open, closed, all
label string Filter by label
assignee string Filter by assignee username
page int Page number
per_page int Items per page (max 100)

Create Issue

POST /api/repos/{owner}/{repo}/issues

Body:

{
  "title": "Bug report",
  "body": "Something is broken",
  "type": "issue",
  "labels": ["bug"],
  "assignees": ["username"]
}

Get Issue

GET /api/repos/{owner}/{repo}/issues/{number}

Update Issue

PATCH /api/repos/{owner}/{repo}/issues/{number}

Body:

{
  "title": "Updated title",
  "state": "closed",
  "labels": ["bug", "priority"]
}

Add Comment

POST /api/repos/{owner}/{repo}/issues/{number}/comments

Body:

{
  "body": "This is a comment"
}

Pull Requests

List Pull Requests

GET /api/repos/{owner}/{repo}/pulls?state=open

Query Parameters:

Name Type Description
state string open, closed, merged, all
head string Filter by head branch
base string Filter by base branch

Create Pull Request

POST /api/repos/{owner}/{repo}/pulls

Body:

{
  "title": "Fix login bug",
  "body": "Fixes issue #42",
  "head": "feature/login-fix",
  "base": "main"
}

Get Pull Request

GET /api/repos/{owner}/{repo}/pulls/{number}

Update Pull Request

PATCH /api/repos/{owner}/{repo}/pulls/{number}

Merge Pull Request

POST /api/repos/{owner}/{repo}/pulls/{number}/merge

Body:

{
  "method": "squash",
  "message": "Custom merge message"
}

List Reviews

GET /api/repos/{owner}/{repo}/pulls/{number}/reviews

Create Review

POST /api/repos/{owner}/{repo}/pulls/{number}/reviews

Body:

{
  "body": "Looks good!",
  "event": "APPROVE",
  "comments": [
    {
      "path": "src/auth.ts",
      "line": 45,
      "body": "Consider adding error handling here"
    }
  ]
}

Stacked PRs

List Stacks

GET /api/repos/{owner}/{repo}/stacks

Create Stack Entry

POST /api/repos/{owner}/{repo}/stacks

Body:

{
  "prNumber": 124,
  "basePrNumber": 123
}

Sync Stack

POST /api/repos/{owner}/{repo}/stacks/sync

Merge Queue

List Queue

GET /api/repos/{owner}/{repo}/merge-queue

Add to Queue

POST /api/repos/{owner}/{repo}/merge-queue

Body:

{
  "prNumber": 125,
  "priority": "normal"
}

Remove from Queue

DELETE /api/repos/{owner}/{repo}/merge-queue/{entryId}

CI/CD (Actions)

List Workflow Runs

GET /api/repos/{owner}/{repo}/actions/runs

Get Workflow Run

GET /api/repos/{owner}/{repo}/actions/runs/{runId}

List Jobs

GET /api/repos/{owner}/{repo}/actions/runs/{runId}/jobs

Get Job Logs

GET /api/repos/{owner}/{repo}/actions/jobs/{jobId}/logs

Rerun Workflow

POST /api/repos/{owner}/{repo}/actions/runs/{runId}/rerun

Cancel Workflow

POST /api/repos/{owner}/{repo}/actions/runs/{runId}/cancel

Releases

List Releases

GET /api/repos/{owner}/{repo}/releases

Create Release

POST /api/repos/{owner}/{repo}/releases

Body:

{
  "tagName": "v1.0.0",
  "name": "Release 1.0.0",
  "body": "Release notes...",
  "isDraft": false,
  "isPrerelease": false
}

Get Release

GET /api/repos/{owner}/{repo}/releases/{id}

Delete Release

DELETE /api/repos/{owner}/{repo}/releases/{id}

Organizations

List Organizations

GET /api/orgs

Get Organization

GET /api/orgs/{org}

List Members

GET /api/orgs/{org}/members

Add Member

POST /api/orgs/{org}/members

Body:

{
  "username": "newmember",
  "role": "member"
}

Notifications

List Notifications

GET /api/notifications?filter=unread&prioritize=true

Query Parameters:

Name Type Description
filter string unread, read, archived, blocking, all
prioritize boolean Sort by priority score
personalize boolean Apply personalization boost
channel string Filter by routing channel

Response:

{
  "success": true,
  "data": {
    "notifications": [
      {
        "id": "notif_1",
        "type": "comment",
        "priority": "medium",
        "priorityScore": 5,
        "isRead": false,
        "actor": { "username": "bob" },
        "repository": { "name": "my-repo" }
      }
    ],
    "unreadCount": 3,
    "routing": {
      "personalized": true,
      "channelFilter": null
    }
  }
}

Mark as Read

POST /api/notifications/{id}/read

Archive Notification

POST /api/notifications/{id}/archive

Webhooks

List Webhooks

GET /api/repos/{owner}/{repo}/webhooks

Create Webhook

POST /api/repos/{owner}/{repo}/webhooks

Body:

{
  "url": "https://yourapp.com/webhook",
  "events": ["push", "pull_request", "issues"],
  "secret": "your-webhook-secret"
}

Test Webhook

POST /api/repos/{owner}/{repo}/webhooks/{id}/test

Delete Webhook

DELETE /api/repos/{owner}/{repo}/webhooks/{id}

Search

Global Search

GET /api/search?q=keyword&type=repositories

Query Parameters:

Name Type Description
q string Search query
type string repositories, users, issues, pull_requests
page int Page number

Admin

System Stats

GET /api/admin/stats

Response:

{
  "success": true,
  "data": {
    "totalRepos": 45,
    "totalUsers": 12,
    "collaborations": 128,
    "systemStatus": {
      "cpuLoad": 15,
      "memoryUsage": 42,
      "storageUsage": 45,
      "uptime": "5d 3h 12m"
    },
    "quickStats": {
      "commitsToday": 23,
      "prsMerged": 5,
      "issuesClosed": 8,
      "activeUsers": 6
    }
  }
}

Audit Logs

GET /api/admin/audit-logs?page=1

List Runners

GET /api/admin/runners

Error Codes

Status Code Description
200 — Success
201 — Created
204 — No Content
400 BAD_REQUEST Invalid request parameters
401 UNAUTHORIZED Missing or invalid authentication
403 FORBIDDEN Insufficient permissions
404 NOT_FOUND Resource not found
409 CONFLICT Resource conflict
422 VALIDATION_ERROR Validation failed
429 RATE_LIMITED Too many requests
500 SERVER_ERROR Internal server error

Error Response:

{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "Repository not found"
  }
}

Pagination

List endpoints support pagination via query parameters:

GET /api/repos?page=2&per_page=50

Pagination metadata is included in the response:

{
  "meta": {
    "page": 2,
    "perPage": 50,
    "total": 127,
    "totalPages": 3
  }
}