How to read this page
Contract guide, not stricter than the contract
24 documented route-method combinations
Health, Forge Jira App access, launch-code exchange, task permits, telemetry, and project-index surfaces are grouped below by how they are actually used.
Machine schema at /openapi.json
The backend also serves Swagger UI at /docs, while this page explains the contract in first-party terms and highlights what is deprecated or disabled in the live codebase.
Forge + launch-code + permit flow
The modern path is Forge-authenticated Jira App access, a strictly single-use Jira request key, a one-time launch code, and a short-lived task permit inside the IDE.
Authentication surfaces
Prefer the modern path for net-new integrations
Forge + rotating Jira request keys
- The Jira App authenticates with a Forge bearer token rather than a stored local backend key.
- The first Jira-side backend call is POST /v1/jira/request-key, which returns the current single-use request key.
- The server accepts each Jira request key exactly once, keeps it short-lived, binds it to the same tenant/session context, and rejects replays.
- Each successful Jira App backend response rotates X-SeeCodes-Next-Request-Key, invalidates the previous key, and resolves concurrent races so only one request can consume a given key.
One-time launch codes
- POST /v1/security/vscode-link returns a one-time launch code plus vscode:// and HTTPS launcher URLs.
- The browser-facing launch link carries only the launch code, never the reusable task permit.
- POST /v1/security/launch-exchange rejects unless the code is unused and its bound projectId/taskId exactly match the exchange request.
Task-scoped permits
- The exchanged task permit is the bearer credential used on /v1/tasks/* and /v1/projects/*/indexes/*.
- The permit is bound to one Jira project/task pair, and the server rejects task, run, and project-index requests outside that exact binding.
- The current backend issues a fresh 24-hour permit after launch-code exchange or direct task-permit minting.
POST /v1/jira/request-key
Authorization: Bearer <forge-invocation-token>
GET /v1/instances/me
Authorization: Bearer <forge-invocation-token>
X-SeeCodes-Jira-Request-Key: <single-use request key>
X-SeeCodes-Next-Request-Key: <rotate this into the next Jira App request>
Authorization: Bearer <task-permit>Common integration flows
Jira App backend request-key handshake
- POST /v1/jira/request-key with a Forge bearer token.
- Call a Jira App backend route such as GET /v1/instances/me with X-SeeCodes-Jira-Request-Key.
- On success, the server consumes that key, rejects later replays, and returns X-SeeCodes-Next-Request-Key.
- Rotate immediately to the new current key on the next Jira App backend request; concurrent replays of the old key lose.
Secure Jira-to-IDE launch
- POST /v1/security/vscode-link returns a one-time launch code plus vscode:// and HTTPS launcher URLs.
- The browser opens /v1/launch or the vscode:// URI with the launch code only.
- The extension calls POST /v1/security/launch-exchange to swap the one-time code for the real task permit; the backend rejects the exchange unless projectId/taskId exactly match the code binding.
- The extension then calls GET /v1/tasks/context to hydrate Jira task context and any initial editor payload.
Run and inspect task work
- POST /v1/tasks/init creates the run and returns presigned upload targets such as list.md.
- POST /v1/tasks/{runId}/start queues execution after the uploads complete.
- GET /v1/tasks/{runId} is polled until the run settles.
- GET /v1/tasks/{runId}/output and GET /v1/tasks/{runId}/logs fetch the final artifacts.
Sync progress and retrospectives
- POST /v1/tasks/{taskId}/progress stores the issue-level ready / left / risk document.
- POST /v1/tasks/activity-snapshot records short activity windows for retrospective scoring.
- GET /v1/jira/usage and GET /v1/jira/team-competition power the Jira-side analytics and retrospective views.
- POST /v1/jira/instance-metrics lets the Jira App report installation-level counts such as installed users.
Tag: system
Health and schema
/healthzHealth check
Minimal liveness probe used by deployment verification and monitoring.
{
"ok": true
}Notes
- This is the lightweight route most smoke tests and health checks should probe first.
/openapi.jsonOpenAPI schema
Returns the machine-readable OpenAPI document used by client generators and the built-in Swagger UI.
application/json
- OpenAPI document for the current public surfaceNotes
- Swagger UI is served separately at /docs.
Tags: security + instances + tasks
Forge installation access, launch security, and task context
/v1/jira/request-keyIssue a single-use Jira backend request key
Bootstraps the single-use request-key rotation used by Forge-authenticated Jira App backend calls.
Access pattern
Forge bearer token from the Jira App.
{
}{
"ok": true,
"requestKey": "sc_jira_req_...",
"expiresAt": 1735689600
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
- The current implementation accepts an optional body but does not rely on it for authentication.
- The server accepts a Jira request key exactly once.
- The server rejects a Jira App request unless the presented request key is the current unexpired key bound to the same tenant/session context.
- On successful use, the server atomically consumes the current request key, returns X-SeeCodes-Next-Request-Key, invalidates the previous key, and handles concurrent races safely so only one request can consume that key.
- Subsequent Jira App backend calls send X-SeeCodes-Jira-Request-Key and read X-SeeCodes-Next-Request-Key from the response.
/v1/instances/meRead installation state
Returns the backend view of the current Jira installation after Forge auth and request-key validation.
Access pattern
Forge bearer token plus X-SeeCodes-Jira-Request-Key. The server rejects the request unless that key is the current unexpired single-use key bound to the same tenant/session context. Optional cloudIdHint and siteUrlHint values help the backend resolve the correct installation.
Parameters
- cloudIdHint (optional string or null)
- siteUrlHint (optional string or null)
{
"ok": true,
"cloudId": "ari:cloud:ecosystem::installation/...",
"status": "active",
"credits": 42,
"apiKeyPrefix": "av_inst_...",
"updatedAt": 1710000000,
"installationId": "ari:cloud:ecosystem::installation/...",
"capabilitySet": "capabilityadvanced",
"licenseActive": true,
"activationSource": "forge-license",
"devModeActive": false,
"billingMode": "forge",
"siteUrl": "https://tenant.atlassian.net"
}Notes
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- This is the primary installation-health route used by the Jira App settings and dashboard surfaces.
/v1/security/vscode-linkMint a secure IDE launch payload
Generates the one-time launch code and launcher URLs used to open a Jira task in VS Code or Cursor.
Access pattern
Forge bearer token plus X-SeeCodes-Jira-Request-Key. The server rejects the request unless that key is the current unexpired single-use key bound to the same tenant/session context. Optional cloudIdHint and siteUrlHint values help the backend resolve the correct installation.
{
"projectId": "AUTH",
"taskId": "AUTH-128",
"userAccountId": "557058:abcd...",
"cloudIdHint": "optional",
"siteUrlHint": "https://tenant.atlassian.net",
"expirationDays": 14,
"jiraContext": { "...": "optional task context" },
"initialTaiDoc": { "...": "optional editor boot state" }
}{
"ok": true,
"launchCode": "sc_launch_...",
"vscodeUrl": "vscode://eprojac.seecodes-task-runner/project/AUTH/task/AUTH-128?code=sc_launch_...",
"httpsUrl": "https://dev.seecodes.com/v1/launch?p=AUTH&t=AUTH-128&c=sc_launch_...",
"expiresAt": 1735689600
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- The minted launch code or task permit is bound to the exact projectId and taskId in the request. Later task and project routes enforce that binding as a hard server-side invariant.
- The launcher payload intentionally returns launchCode rather than the reusable task permit.
- The browser-facing launch link lifetime is currently configurable from 1 to 14 days in Jira App settings.
/v1/security/task-permitMint a task-scoped permit directly
Generates the bearer permit for a specific Jira task without going through the browser launcher flow.
Access pattern
Forge bearer token plus X-SeeCodes-Jira-Request-Key. The server rejects the request unless that key is the current unexpired single-use key bound to the same tenant/session context. Optional cloudIdHint and siteUrlHint values help the backend resolve the correct installation.
{
"projectId": "AUTH",
"taskId": "AUTH-128",
"userAccountId": "557058:abcd...",
"cloudIdHint": "optional",
"siteUrlHint": "https://tenant.atlassian.net"
}{
"ok": true,
"cloudId": "ari:cloud:ecosystem::installation/...",
"projectId": "AUTH",
"taskId": "AUTH-128",
"permit": "eyJhbGciOi...",
"expiresAt": 1735689600
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- The minted launch code or task permit is bound to the exact projectId and taskId in the request. Later task and project routes enforce that binding as a hard server-side invariant.
- This direct permit-minting route is what Jira-side background flows use when they need task-scoped backend access without launching the IDE.
/v1/security/launch-exchangeExchange a one-time launch code for the task permit
Consumes the browser-facing one-time launch code and returns the real task-scoped bearer permit used by the IDE.
Access pattern
The one-time launch code in the request body is the credential.
{
"code": "sc_launch_...",
"projectId": "AUTH",
"taskId": "AUTH-128"
}{
"ok": true,
"cloudId": "ari:cloud:ecosystem::installation/...",
"projectId": "AUTH",
"taskId": "AUTH-128",
"permit": "eyJhbGciOi...",
"expiresAt": 1735689600
}Notes
- First-party extensions exchange the launch code as soon as the IDE opens.
- The launch code is single-use and the server rejects every replay after the first successful exchange.
- The server rejects launch exchange unless the code is unused, unexpired, and the supplied projectId and taskId exactly match the values bound when the code was minted.
/v1/tasks/contextRead stored task context
Returns the stored Jira task context and optional initial editor payload for the permit’s project/task pair.
Access pattern
Task permit via Authorization: Bearer <task-permit>. The server rejects task, run, and project-index requests unless they resolve to the exact projectId/taskId pair bound into that permit.
{
"ok": true,
"context": {
"title": "Implement auth flow",
"descriptionMd": "...",
"attachments": [],
"images": []
},
"initialTai": {
"version": 1,
"task": { "...": "..." }
}
}Notes
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- The server resolves task context only for the exact projectId/taskId pair bound into the presented permit.
- Returns { ok: false, error: "Context not found" } when no Jira-side context was persisted with the task.
/v1/launchHTTPS launcher for vscode:// fallback
Small HTML launcher page that redirects into the vscode:// protocol while preserving optional backend-route and language hints.
Parameters
- p (required string) — projectId
- t (required string) — taskId
- c (required string) — one-time launch code
- baseUrl (optional string or null) — backend route hint preserved through the launcher
- statusLanguage (optional string or null) — task-status language preserved through the launcher
text/html
- lightweight launcher page
- redirects into vscode://... using the one-time launch codeNotes
- The current launcher contract uses c for the one-time launch code.
- The older k query parameter is no longer part of the current public launcher flow.
Tags: tasks
Task lifecycle, progress, and activity snapshots
/v1/tasks/{taskId}/progressSave task progress
Stores structured issue-level progress such as ready items, remaining work, confidence, and risk flags.
Access pattern
Task permit via Authorization: Bearer <task-permit>. The server rejects task, run, and project-index requests unless they resolve to the exact projectId/taskId pair bound into that permit.
{
"ready": ["Protected-route wrapper is live"],
"left": ["Callback validation still needs coverage"],
"progress": "67%",
"confidence": "Medium",
"risks": ["Identity provider payload may still change"],
"logs": ["Recent activity summary line"]
}{
"ok": true
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
- The server rejects requests unless the path taskId exactly matches the permit's bound taskId.
- This is the structured state later surfaced in Jira issue panels, the AI Readiness field, and the AI Progress Report field.
/v1/tasks/{taskId}/progressRead task progress
Returns the stored progress document for a Jira issue.
Access pattern
Task permit, or Forge bearer token plus X-SeeCodes-Jira-Request-Key when the Jira App is the caller. When a task permit is used, the server still enforces the exact projectId/taskId binding carried by that permit.
Parameters
- projectId (required string)
- cloudIdHint (optional string or null)
{
"ok": true,
"progress": {
"updatedAt": "2026-04-04T12:34:56Z",
"ready": ["Protected-route wrapper is live"],
"left": ["Callback validation still needs coverage"],
"progress": "67%",
"confidence": "Medium",
"risks": ["Identity provider payload may still change"],
"logs": ["Recent activity summary line"]
}
}Notes
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- When this route is called with a task permit, the server rejects requests unless query projectId exactly matches the permit's bound projectId and path taskId exactly matches the permit's bound taskId.
- The Jira App issue panel, the custom fields, and the extension all read the same structured progress document.
/v1/tasks/initInitialize an AI run
Creates a runId and returns presigned upload targets for the task input files.
Access pattern
Task permit via Authorization: Bearer <task-permit>. The server rejects task, run, and project-index requests unless they resolve to the exact projectId/taskId pair bound into that permit.
{
"model": "strict light",
"files": ["list.md"]
}{
"ok": true,
"runId": "run_abc123",
"bucket": "task-bucket-name",
"prefix": "tmp/...",
"uploads": {
"list.md": "https://presigned-upload-url"
}
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- The created run is bound to the exact projectId/taskId pair carried by the presented permit. Later /v1/tasks/{runId}* routes reject requests outside that binding.
- The files array defaults to ["list.md"] when omitted by first-party callers.
/v1/tasks/{runId}/startQueue the AI run
Starts execution for a previously initialized run after the required uploads complete.
Access pattern
Task permit via Authorization: Bearer <task-permit>. The server rejects task, run, and project-index requests unless they resolve to the exact projectId/taskId pair bound into that permit.
{
"model": "strict light",
"userPrompt": "generate change log"
}{
"ok": true,
"runId": "run_abc123",
"status": "queued",
"estimatedInputTokens": 12456,
"estimatedCredits": 37
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- The server rejects requests unless the path runId resolves to the same projectId/taskId pair bound into the presented permit.
/v1/tasks/{runId}Poll run status
Returns the current status document for a run.
Access pattern
Task permit via Authorization: Bearer <task-permit>. The server rejects task, run, and project-index requests unless they resolve to the exact projectId/taskId pair bound into that permit.
{
"ok": true,
"status": {
"status": "queued | in_process | processing_remote | succeeded | failed",
"updatedAt": "2026-04-04T12:34:56Z",
"error": "optional",
"resultZipUrl": "optional"
}
}Notes
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- The server rejects requests unless the path runId resolves to the same projectId/taskId pair bound into the presented permit.
- First-party clients poll this route until the run settles.
/v1/tasks/{runId}/outputRead task output
Returns the final text artifact produced by a successful AI run.
Access pattern
Task permit via Authorization: Bearer <task-permit>. The server rejects task, run, and project-index requests unless they resolve to the exact projectId/taskId pair bound into that permit.
text/plain
- raw output artifact
- commonly markdown or other structured text depending on the promptNotes
- The server rejects requests unless the path runId resolves to the same projectId/taskId pair bound into the presented permit.
- The published OpenAPI document leaves the schema open-ended; first-party clients treat this as plain text.
/v1/tasks/{runId}/logsRead task logs
Returns the plain-text execution log for a run.
Access pattern
Task permit via Authorization: Bearer <task-permit>. The server rejects task, run, and project-index requests unless they resolve to the exact projectId/taskId pair bound into that permit.
text/plain
- raw execution log artifact for the runNotes
- The server rejects requests unless the path runId resolves to the same projectId/taskId pair bound into the presented permit.
- Useful when a run fails or needs post-run investigation.
/v1/tasks/activity-snapshotSave task activity snapshot
Persists a short activity window with active-time, diff-size, and semantic change signals for retrospective scoring.
Access pattern
Task permit via Authorization: Bearer <task-permit>. The server rejects task, run, and project-index requests unless they resolve to the exact projectId/taskId pair bound into that permit.
{
"windowStartedAt": "2026-04-04T10:00:00.000Z",
"windowEndedAt": "2026-04-04T10:15:00.000Z",
"taskStartedAt": "2026-04-04T08:30:00.000Z",
"taskAgeMinutes": 105,
"humanActiveMs": 420000,
"locAdded": 28,
"locRemoved": 11,
"locTotal": 39,
"changedFiles": ["src/auth.ts", "src/routes.tsx"],
"changedFilesCount": 2,
"architectureChange": false,
"logicChange": true,
"specificationUiChange": false
}{
"ok": true,
"stored": true,
"timestamp": "2026-04-04T10:15:00.000000Z",
"effortUnits": 91
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- The server stores the snapshot only against the exact projectId/taskId pair bound into the presented permit and rejects cross-task writes.
- This route feeds the Team Competition retrospective board instead of the issue-level progress field.
Tags: telemetry
Telemetry, analytics, and retrospectives
/v1/jira/usageRead Jira usage analytics
Returns recent usage rows plus the backend’s current availableCredits value for the installation.
Access pattern
Forge bearer token plus X-SeeCodes-Jira-Request-Key. The server rejects the request unless that key is the current unexpired single-use key bound to the same tenant/session context.
Parameters
- cloudIdHint (optional string or null)
{
"ok": true,
"items": [
{
"timestamp": "2026-04-04T12:34:56Z",
"type": "task_run",
"taskId": "AUTH-128",
"credits": 5
}
],
"availableCredits": 42
}Notes
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- Used by the Jira AI Requests Analytics dashboard.
/v1/jira/instance-metricsReport installation metrics
Lets the Jira App report installation-level metrics such as installed user counts.
Access pattern
Forge bearer token plus X-SeeCodes-Jira-Request-Key. The server rejects the request unless that key is the current unexpired single-use key bound to the same tenant/session context.
{
"installedUsersCount": 17,
"source": "forge-hourly-sync"
}{
"ok": true
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
/v1/jira/telemetry/eventsIngest telemetry events (currently disabled)
Direct editor-side telemetry ingestion route that is intentionally disabled in the current live codebase.
Access pattern
Published schema route; the live codebase currently responds with an authenticated-ingestion deprecation error.
{
"events": [
{
"eventType": "ai.usage",
"cloudId": "ari:cloud:ecosystem::installation/...",
"requestId": "1f0d7e2e-...",
"timestamp": "2026-04-04T12:34:56Z"
}
]
}{
"detail": "Direct VS Code telemetry ingestion is disabled until an authenticated sender contract with replay protection and rate limits is finalized."
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
- The extension-side sender exists in code, but the backend keeps this route disabled until the authenticated sender contract is finalized.
/v1/jira/team-competitionRead team competition data
Returns scoped telemetry items, task summaries, the current monthly baseline, and formula metadata for the retrospective board.
Access pattern
Forge bearer token plus X-SeeCodes-Jira-Request-Key. The server rejects the request unless that key is the current unexpired single-use key bound to the same tenant/session context. Optional cloudIdHint and siteUrlHint values help the backend resolve the correct installation.
Parameters
- projectId (optional string or null)
- startDate (optional string or null)
- endDate (optional string or null)
- cloudIdHint (optional string or null)
- siteUrlHint (optional string or null)
{
"ok": true,
"items": [...],
"taskSummaries": [...],
"monthBaseline": {
"month": "2026-04",
"taskCount": 18,
"medianEffortUnits": 72
},
"formula": {
"version": "v1",
"weights": {
"activeMinute": 1.8,
"locChanged": 0.18,
"changedFile": 3,
"architectureBonus": 24,
"logicBonus": 14,
"specificationUiBonus": 10
}
},
"sourceSummary": {
"snapshotItems": 124,
"taskRunFallbackItems": 12,
"vscodeFallbackItems": 5,
"fallbackTaskCount": 7
}
}Notes
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- This route is paired with POST /v1/tasks/activity-snapshot, which is how IDE activity reaches the retrospective board.
Tags: models + tasks
Model catalog and project indexes
/v1/modelsRead the model catalog
Returns the current model aliases, context limits, descriptions, and pricing metadata exposed by the backend.
{
"ok": true,
"models": [
{
"id": "strict light",
"name": "strict light",
"maxContext": 100000,
"description": "Fast, high-context strict tasks",
"pricing": {
"base": 12.5,
"per_token": 0.0006
}
}
]
}Notes
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- Used by IDE and Jira surfaces that need model pickers or context-limit hints.
/v1/projects/{projectId}/indexes/queryQuery reusable project index entries
Looks up path/hash pairs against the stored project index and returns same-path or hash-reused matches.
Access pattern
Task permit via Authorization: Bearer <task-permit>. The server rejects task, run, and project-index requests unless they resolve to the exact projectId/taskId pair bound into that permit.
{
"items": [
{
"path": "src/auth.ts",
"hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
]
}{
"ok": true,
"updatedAt": 1710000000000,
"matches": {
"src/auth.ts": {
"pathMatched": true,
"hashMatchedPath": "src/auth.ts",
"entry": {
"hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"updatedAt": 1710000000000,
"short": "Authentication helper",
"detailed": "Longer explainer...",
"important_symbols": ["AuthGuard"]
}
}
}
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- The server rejects requests unless the path projectId exactly matches the permit's bound projectId.
/v1/projects/{projectId}/indexes/upsertUpsert reusable project index entries
Writes or updates index entries and optionally deletes paths that should be removed from the remote index.
Access pattern
Task permit via Authorization: Bearer <task-permit>. The server rejects task, run, and project-index requests unless they resolve to the exact projectId/taskId pair bound into that permit.
{
"entries": {
"src/auth.ts": {
"hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"updatedAt": 1710000000000,
"short": "Authentication helper",
"detailed": "Longer explainer...",
"important_symbols": ["AuthGuard"],
"dependencies": ["src/session.ts"],
"exports": ["AuthGuard"]
}
},
"deletePaths": ["src/old-auth.ts"]
}{
"ok": true,
"updatedAt": 1710000000000,
"upserted": 1,
"deleted": 1,
"totalFiles": 340
}Notes
- The published OpenAPI schema intentionally leaves this body open-ended; the example below shows the stable first-party payload shape.
- The published OpenAPI schema intentionally leaves this response open-ended; the example below shows the stable first-party envelope.
- The server rejects requests unless the path projectId exactly matches the permit's bound projectId.