Pointy Backend API
v1.0.0/backendHTTP API served by the Pointy backend. All routes are mounted under the /backend prefix by the reverse proxy.
autocomplete
/autocomplete
Returns autocomplete suggestions for a field, evaluated against the user repository.
Body
autocompletestringrequiredcontextobjectrequiredlimitinteger[-9223372036854776000, 9223372036854776000]querystringrequiredtemplatestringrequiredParameters
commitstringqueryResponse
Invalid body or commit
curl -X POST '/backend/autocomplete' \
-H 'Content-Type: application/json;charset=utf-8' \
-d '{
"autocomplete": "string",
"context": {},
"limit": -9223372036854776000,
"query": "string",
"template": "string"
}'const response = await fetch('/backend/autocomplete', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8',
},
body: JSON.stringify({
"autocomplete": "string",
"context": {},
"limit": -9223372036854776000,
"query": "string",
"template": "string"
}),
});
const data = await response.json();import requests
payload = {
"autocomplete": "string",
"context": {},
"limit": -9223372036854776000,
"query": "string",
"template": "string"
}
response = requests.post('/backend/autocomplete', json=payload)
data = response.json(){
"autocomplete": "string",
"context": {},
"limit": -9223372036854776000,
"query": "string",
"template": "string"
}[
"string"
]commit-hash
/commit-hash
Returns the commit hash the user repository is currently checked out at.
Response
curl -X GET '/backend/commit-hash'const response = await fetch('/backend/commit-hash', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/commit-hash')
data = response.json()stringnotices
/notices
Returns evaluation notices (warnings and errors) for a step.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerycommitstringqueryResponse
Invalid commit or id
curl -X GET '/backend/notices'const response = await fetch('/backend/notices', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/notices')
data = response.json(){}presets
/presets
Returns the field presets defined in the user repository.
Parameters
commitstringqueryResponse
Invalid commit
curl -X GET '/backend/presets'const response = await fetch('/backend/presets', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/presets')
data = response.json(){}project-entities
/project-entities
Assigns a record to a project.
Parameters
project_idinteger[-9223372036854776000, 9223372036854776000]requiredqueryentity_idinteger[-9223372036854776000, 9223372036854776000]requiredqueryResponse
Invalid entity_id or project_id
curl -X POST '/backend/project-entities'const response = await fetch('/backend/project-entities', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/backend/project-entities')
data = response.json()/project-entities
Removes a record assignment from a project.
Parameters
project_idinteger[-9223372036854776000, 9223372036854776000]requiredqueryentity_idinteger[-9223372036854776000, 9223372036854776000]requiredqueryResponse
Invalid entity_id or project_id
curl -X DELETE '/backend/project-entities'const response = await fetch('/backend/project-entities', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/backend/project-entities')
data = response.json()/project-entities/batch
Assigns multiple records to a project in one request.
Body
Parameters
project_idinteger[-9223372036854776000, 9223372036854776000]requiredqueryResponse
Invalid body or project_id
curl -X POST '/backend/project-entities/batch' \
-H 'Content-Type: application/json;charset=utf-8' \
-d '[
-9223372036854776000
]'const response = await fetch('/backend/project-entities/batch', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8',
},
body: JSON.stringify([
-9223372036854776000
]),
});
const data = await response.json();import requests
payload = [
-9223372036854776000
]
response = requests.post('/backend/project-entities/batch', json=payload)
data = response.json()[
-9223372036854776000
]projects
/projects
Returns all project records, optionally at a specific user-repo commit.
Parameters
commitstringqueryResponse
Invalid commit
curl -X GET '/backend/projects'const response = await fetch('/backend/projects', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/projects')
data = response.json(){}/projects
Creates a project record in the user repository.
Body
Response
Invalid body
curl -X POST '/backend/projects' \
-H 'Content-Type: application/json' \
-d '{}'const response = await fetch('/backend/projects', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.post('/backend/projects', json=payload)
data = response.json(){}{}/projects
Deletes a project record.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredqueryResponse
Invalid id
curl -X DELETE '/backend/projects'const response = await fetch('/backend/projects', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/backend/projects')
data = response.json()/projects
Updates an existing project record.
Body
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredqueryResponse
Invalid body or id
curl -X PATCH '/backend/projects' \
-H 'Content-Type: application/json' \
-d '{}'const response = await fetch('/backend/projects', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.patch('/backend/projects', json=payload)
data = response.json(){}run-step
/run-step
Triggers a build of a step.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerycommitstringqueryResponse
Invalid commit or id
curl -X POST '/backend/run-step'const response = await fetch('/backend/run-step', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/backend/run-step')
data = response.json()src-files
/src-files
Lists source files available to a step.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerypathstringqueryResponse
Invalid path or id
curl -X GET '/backend/src-files'const response = await fetch('/backend/src-files', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/src-files')
data = response.json()[
{
"isDir": true,
"mimeType": "string",
"name": "string",
"seekable": true,
"size": 0,
"viewable": true
}
]/src-files/download
Downloads a single source file.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerypathstringrequiredqueryResponse
Invalid path or id
curl -X GET '/backend/src-files/download'const response = await fetch('/backend/src-files/download', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/src-files/download')
data = response.json()"<binary>"/src-files/seek
Returns a bounded source-file chunk. Specify exactly one of line or offset and a nonzero signed byte count: positive bytes read forward from the anchor; negative bytes read backward and end at the anchor.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerypathstringrequiredquerylineinteger[-9223372036854776000, 9223372036854776000]queryoffsetinteger[-9223372036854776000, 9223372036854776000]querybytesinteger[-9223372036854776000, 9223372036854776000]requiredqueryResponse
Invalid bytes or offset or line or path or id
curl -X GET '/backend/src-files/seek'const response = await fetch('/backend/src-files/seek', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/src-files/seek')
data = response.json(){
"content": "string",
"endLine": -9223372036854776000,
"endOffset": -9223372036854776000,
"eof": true,
"startLine": -9223372036854776000,
"startOffset": -9223372036854776000
}step
/step
Creates a step, optionally seeded from a source step.
Body
Parameters
project_idinteger[-9223372036854776000, 9223372036854776000]querysource_idinteger[-9223372036854776000, 9223372036854776000]queryResponse
Invalid body or source_id or project_id
curl -X POST '/backend/step' \
-H 'Content-Type: application/json' \
-d '{}'const response = await fetch('/backend/step', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.post('/backend/step', json=payload)
data = response.json(){}{}/step
Updates an existing step record.
Body
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredqueryResponse
Invalid body or id
curl -X PATCH '/backend/step' \
-H 'Content-Type: application/json' \
-d '{}'const response = await fetch('/backend/step', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const data = await response.json();import requests
payload = {}
response = requests.patch('/backend/step', json=payload)
data = response.json(){}step-config
/step-config
Returns the step configuration defined in the user repository.
Parameters
commitstringqueryResponse
Invalid commit
curl -X GET '/backend/step-config'const response = await fetch('/backend/step-config', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/step-config')
data = response.json(){}step-files
/step-files
Lists files in a step's output directory.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerycommitstringquerypathstringqueryResponse
Invalid path or commit or id
curl -X GET '/backend/step-files'const response = await fetch('/backend/step-files', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/step-files')
data = response.json()[
{
"isDir": true,
"mimeType": "string",
"name": "string",
"seekable": true,
"size": 0,
"viewable": true
}
]/step-files/bundle/{step-id}/{commit}/{segments}
Serves a raw file within an immutable step-output bundle.
Parameters
step-idinteger[-9223372036854776000, 9223372036854776000]requiredpathcommitstringrequiredpathsegmentsstringrequiredpathResponse
step-id or commit or segments not found
curl -X GET '/backend/step-files/bundle/{step-id}/{commit}/{segments}'const response = await fetch('/backend/step-files/bundle/{step-id}/{commit}/{segments}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/step-files/bundle/{step-id}/{commit}/{segments}')
data = response.json()"<binary>"/step-files/download
Downloads a single file from a step's output directory.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerycommitstringquerypathstringrequiredqueryResponse
Invalid path or commit or id
curl -X GET '/backend/step-files/download'const response = await fetch('/backend/step-files/download', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/step-files/download')
data = response.json()"<binary>"/step-files/extras
Returns a step's JSON extras payload.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerycommitstringquerypathstringqueryResponse
Invalid path or commit or id
curl -X GET '/backend/step-files/extras'const response = await fetch('/backend/step-files/extras', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/step-files/extras')
data = response.json(){}/step-files/raw/{segments}
Serves the raw bytes of a file from a step's output directory.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerycommitstringquerysegmentsstringrequiredpathResponse
Invalid commit or id
segments not found
curl -X GET '/backend/step-files/raw/{segments}'const response = await fetch('/backend/step-files/raw/{segments}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/step-files/raw/{segments}')
data = response.json()"<binary>"/step-files/seek
Returns a bounded file chunk. Specify exactly one of line or offset and a nonzero signed byte count: positive bytes read forward from the anchor; negative bytes read backward and end at the anchor.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerycommitstringquerypathstringrequiredquerylineinteger[-9223372036854776000, 9223372036854776000]queryoffsetinteger[-9223372036854776000, 9223372036854776000]querybytesinteger[-9223372036854776000, 9223372036854776000]requiredqueryResponse
Invalid bytes or offset or line or path or commit or id
curl -X GET '/backend/step-files/seek'const response = await fetch('/backend/step-files/seek', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/step-files/seek')
data = response.json(){
"content": "string",
"endLine": -9223372036854776000,
"endOffset": -9223372036854776000,
"eof": true,
"startLine": -9223372036854776000,
"startOffset": -9223372036854776000
}step-log
/step-log
Returns the build log of a step.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerycommitstringqueryResponse
Invalid commit or id
curl -X GET '/backend/step-log'const response = await fetch('/backend/step-log', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/step-log')
data = response.json()stringstep-status-stream
/step-status-stream
Streams snapshot and heartbeat SSE events for a project's steps. Emits status-error and closes when status evaluation fails.
Parameters
project_idinteger[-9223372036854776000, 9223372036854776000]requiredquerycommitstringqueryResponse
Invalid commit or project_id
curl -X GET '/backend/step-status-stream'const response = await fetch('/backend/step-status-stream', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/step-status-stream')
data = response.json()<binary>stop-step
/stop-step
Stops a running step build.
Parameters
idinteger[-9223372036854776000, 9223372036854776000]requiredquerycommitstringqueryResponse
Invalid commit or id
curl -X POST '/backend/stop-step'const response = await fetch('/backend/stop-step', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/backend/stop-step')
data = response.json()upload
/upload
Uploads files into a step's source directory.
Body
filesArray<string>requiredParameters
idinteger[-9223372036854776000, 9223372036854776000]requiredqueryResponse
Invalid id
curl -X POST '/backend/upload' \
-H 'Content-Type: multipart/form-data' \
-d '{
"files": [
"<binary>"
]
}'const response = await fetch('/backend/upload', {
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
},
body: JSON.stringify({
"files": [
"<binary>"
]
}),
});
const data = await response.json();import requests
payload = {
"files": [
"<binary>"
]
}
response = requests.post('/backend/upload', json=payload)
data = response.json(){
"files": [
"<binary>"
]
}stringuser-repo-info
/user-repo-info
Returns the configured user repository URL and branch.
Response
curl -X GET '/backend/user-repo-info'const response = await fetch('/backend/user-repo-info', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/backend/user-repo-info')
data = response.json(){
"branch": "string",
"url": "string"
}Models
AgentApplyView
objectinvalidatedProjectIdsArray<integer>requiredinvalidatedStepIdsArray<integer>requiredsessionViewAgentSessionViewrequired{
"invalidatedProjectIds": [
-9223372036854776000
],
"invalidatedStepIds": [
-9223372036854776000
],
"sessionView": {
"gitState": {
"branchDiff": "string",
"commitLog": "string",
"hasAgentCommits": true,
"headCommit": "string"
},
"session": {
"activeTurnId": "string",
"agentBranch": "string",
"baseCommit": "string",
"createdAt": "2016-07-22T00:00:00Z",
"lastError": "string",
"preparedApply": {
"agentHead": "string",
"candidateHead": "string",
"candidateWorktree": "string",
"targetHead": "string"
},
"sessionId": "string",
"sessionName": "string",
"status": "string",
"targetBranch": "string",
"updatedAt": "2016-07-22T00:00:00Z",
"worktreePath": "string"
},
"turns": [
{
"turnExitCode": -9223372036854776000,
"turnFinishedAt": "2016-07-22T00:00:00Z",
"turnId": "string",
"turnLog": "string",
"turnLogPath": "string",
"turnPrompt": "string",
"turnSessionId": "string",
"turnStartedAt": "2016-07-22T00:00:00Z",
"turnStatus": "string"
}
]
}
}AgentGitState
objectbranchDiffstringrequiredcommitLogstringrequiredhasAgentCommitsbooleanrequiredheadCommitstringrequired{
"branchDiff": "string",
"commitLog": "string",
"hasAgentCommits": true,
"headCommit": "string"
}AgentSession
objectactiveTurnIdstringagentBranchstringrequiredbaseCommitstringrequiredcreatedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>requiredlastErrorstringpreparedApplyPreparedApplysessionIdstringrequiredsessionNamestringstatusstringrequiredtargetBranchstringrequiredupdatedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>requiredworktreePathstringrequired{
"activeTurnId": "string",
"agentBranch": "string",
"baseCommit": "string",
"createdAt": "2016-07-22T00:00:00Z",
"lastError": "string",
"preparedApply": {
"agentHead": "string",
"candidateHead": "string",
"candidateWorktree": "string",
"targetHead": "string"
},
"sessionId": "string",
"sessionName": "string",
"status": "string",
"targetBranch": "string",
"updatedAt": "2016-07-22T00:00:00Z",
"worktreePath": "string"
}AgentSessionView
objectgitStateAgentGitStaterequiredsessionAgentSessionrequiredturnsArray<AgentTurn>required{
"gitState": {
"branchDiff": "string",
"commitLog": "string",
"hasAgentCommits": true,
"headCommit": "string"
},
"session": {
"activeTurnId": "string",
"agentBranch": "string",
"baseCommit": "string",
"createdAt": "2016-07-22T00:00:00Z",
"lastError": "string",
"preparedApply": {
"agentHead": "string",
"candidateHead": "string",
"candidateWorktree": "string",
"targetHead": "string"
},
"sessionId": "string",
"sessionName": "string",
"status": "string",
"targetBranch": "string",
"updatedAt": "2016-07-22T00:00:00Z",
"worktreePath": "string"
},
"turns": [
{
"turnExitCode": -9223372036854776000,
"turnFinishedAt": "2016-07-22T00:00:00Z",
"turnId": "string",
"turnLog": "string",
"turnLogPath": "string",
"turnPrompt": "string",
"turnSessionId": "string",
"turnStartedAt": "2016-07-22T00:00:00Z",
"turnStatus": "string"
}
]
}AgentTurn
objectturnExitCodeinteger[-9223372036854776000, 9223372036854776000]turnFinishedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>turnIdstringrequiredturnLogstringrequiredturnLogPathstringrequiredturnPromptstringrequiredturnSessionIdstringrequiredturnStartedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>requiredturnStatusstringrequired{
"turnExitCode": -9223372036854776000,
"turnFinishedAt": "2016-07-22T00:00:00Z",
"turnId": "string",
"turnLog": "string",
"turnLogPath": "string",
"turnPrompt": "string",
"turnSessionId": "string",
"turnStartedAt": "2016-07-22T00:00:00Z",
"turnStatus": "string"
}AgentUsage
objectappliedSessionsinteger[-9223372036854776000, 9223372036854776000]requireddiscardedSessionsinteger[-9223372036854776000, 9223372036854776000]requiredopenSessionsinteger[-9223372036854776000, 9223372036854776000]requiredrunningSessionsinteger[-9223372036854776000, 9223372036854776000]requiredtotalSessionsinteger[-9223372036854776000, 9223372036854776000]required{
"appliedSessions": -9223372036854776000,
"discardedSessions": -9223372036854776000,
"openSessions": -9223372036854776000,
"runningSessions": -9223372036854776000,
"totalSessions": -9223372036854776000
}AutocompleteRequest
objectautocompletestringrequiredcontextobjectrequiredlimitinteger[-9223372036854776000, 9223372036854776000]querystringrequiredtemplatestringrequired{
"autocomplete": "string",
"context": {},
"limit": -9223372036854776000,
"query": "string",
"template": "string"
}ConfirmApplyRequest
objectcandidateHeadstringrequiredsessionIdstringrequiredtargetHeadstringrequired{
"candidateHead": "string",
"sessionId": "string",
"targetHead": "string"
}DirEntry
objectisDirbooleanrequiredmimeTypestringnamestringrequiredseekablebooleanrequiredsizeintegerrequiredviewablebooleanrequired{
"isDir": true,
"mimeType": "string",
"name": "string",
"seekable": true,
"size": 0,
"viewable": true
}FileChunk
objectcontentstringrequiredendLineinteger[-9223372036854776000, 9223372036854776000]requiredendOffsetinteger[-9223372036854776000, 9223372036854776000]requiredeofbooleanrequiredstartLineinteger[-9223372036854776000, 9223372036854776000]requiredstartOffsetinteger[-9223372036854776000, 9223372036854776000]required{
"content": "string",
"endLine": -9223372036854776000,
"endOffset": -9223372036854776000,
"eof": true,
"startLine": -9223372036854776000,
"startOffset": -9223372036854776000
}PreparedApply
objectagentHeadstringrequiredcandidateHeadstringrequiredcandidateWorktreestringrequiredtargetHeadstringrequired{
"agentHead": "string",
"candidateHead": "string",
"candidateWorktree": "string",
"targetHead": "string"
}RenameSessionRequest
objectnamestringrequiredsessionIdstringrequired{
"name": "string",
"sessionId": "string"
}