Citra Space Edge Node API
The Edge Node API from Citra Space — 4 operation(s) for edge node.
The Edge Node API from Citra Space — 4 operation(s) for edge node.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/citra-space:citra-space-edge-node-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: SOICAT Edge Node API
version: 0.1.0
tags:
- name: Edge Node
paths:
/edge-node:
get:
description: 'List the edge nodes the caller may bind to a mission (owner-or-admin, non-revoked) — the
source for the mission form''s edge-node picker. Association itself is done via the mission
create/edit form (`edge_node_ids`), not here.'
operationId: list_edge_nodes_edge_node_get
parameters:
- in: header
name: X-Scenario-Context
required: false
schema:
anyOf:
- format: uuid
type: string
- type: 'null'
responses:
'200':
content:
application/json:
schema:
items:
$ref: '#/components/schemas/EdgeNodeSummary'
title: Response List Edge Nodes Edge Node Get
type: array
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: List Edge Nodes
tags:
- Edge Node
post:
description: 'Admin: pre-provision a node + mint its one-use enrollment token (returned once).'
operationId: provision_edge_node_edge_node_post
parameters:
- in: header
name: X-Scenario-Context
required: false
schema:
anyOf:
- format: uuid
type: string
- type: 'null'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ProvisionNodeRequest'
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/ProvisionNodeResponse'
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Provision Edge Node
tags:
- Edge Node
/edge-node/enroll:
post:
description: 'Enroll a node: validate its one-use token, sign its CSR, return the cert bundle.'
operationId: enroll_edge_node_enroll_post
parameters:
- in: header
name: X-Scenario-Context
required: false
schema:
anyOf:
- format: uuid
type: string
- type: 'null'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/NodeEnrollRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/NodeEnrollResponse'
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
security:
- HTTPBearer: []
summary: Enroll
tags:
- Edge Node
/edge-node/renew-cert:
post:
description: 'Renew a node cert via key-pinned proof of possession (no token; self-authenticating, so this
route is excluded from GlobalAuthMiddleware alongside /enroll).'
operationId: renew_cert_edge_node_renew_cert_post
parameters:
- in: header
name: X-Scenario-Context
required: false
schema:
anyOf:
- format: uuid
type: string
- type: 'null'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/NodeRenewRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/NodeEnrollResponse'
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Renew Cert
tags:
- Edge Node
/edge-node/{edge_node_id}/revoke:
post:
description: 'Admin: revoke a node''s cert — the kill switch for a stolen key (renewal turns a stolen key into
an indefinitely renewable credential). Idempotent (already-revoked -> 204); 404 on unknown id.'
operationId: revoke_edge_node_edge_node__edge_node_id__revoke_post
parameters:
- in: path
name: edge_node_id
required: true
schema:
format: uuid
title: Edge Node Id
type: string
- in: header
name: X-Scenario-Context
required: false
schema:
anyOf:
- format: uuid
type: string
- type: 'null'
responses:
'204':
description: Successful Response
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
description: Validation Error
summary: Revoke Edge Node
tags:
- Edge Node
components:
schemas:
ProvisionNodeRequest:
description: Admin body for POST /edge-node (camelCase over the wire).
properties:
citraUserId:
format: uuid
title: Citrauserid
type: string
friendlyName:
title: Friendlyname
type: string
missionId:
anyOf:
- format: uuid
type: string
- type: 'null'
required:
- citraUserId
- friendlyName
title: ProvisionNodeRequest
type: object
ProvisionedNode:
properties:
citraUserId:
format: uuid
title: Citrauserid
type: string
createdAt:
format: date-time
title: Createdat
type: string
friendlyName:
title: Friendlyname
type: string
id:
format: uuid
title: Id
type: string
missionId:
anyOf:
- format: uuid
type: string
- type: 'null'
required:
- id
- citraUserId
- friendlyName
- missionId
- createdAt
title: ProvisionedNode
type: object
NodeRenewRequest:
description: 'Node-supplied body for ``POST /api/edge-node/renew-cert`` (camelCase over the wire).
Bare CSR: the CSR must be signed by the key pinned at enrollment (SPKI-hash match plus a valid
self-signature = proof of possession). No token — key loss requires re-enrollment.'
properties:
advertisedIps:
anyOf:
- items:
type: string
maxItems: 8
type: array
- type: 'null'
description: Refreshed IP SANs (private addresses only); see NodeEnrollRequest.
csrPem:
description: PEM-encoded PKCS#10 CSR signed by the pinned node key.
maxLength: 16384
title: Csrpem
type: string
required:
- csrPem
title: NodeRenewRequest
type: object
ProvisionNodeResponse:
description: The created node plus the one-use enrollment token (shown once; never logged).
properties:
enrollmentToken:
title: Enrollmenttoken
type: string
node:
$ref: '#/components/schemas/ProvisionedNode'
required:
- node
- enrollmentToken
title: ProvisionNodeResponse
type: object
NodeEnrollRequest:
description: Node-supplied body for ``POST /api/edge-node/enroll`` (camelCase over the wire).
properties:
advertisedIps:
anyOf:
- items:
type: string
maxItems: 8
type: array
- type: 'null'
description: LAN addresses to add as IP SANs on the issued cert, so an attached sensor can validate the broker it dials. PRIVATE addresses only — a public IP is rejected. DNS SANs are server-side config and are never taken from the node.
csrPem:
description: PEM-encoded PKCS#10 CSR; the node keypair never leaves the node.
maxLength: 16384
title: Csrpem
type: string
deploymentReport:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
description: Free-form deployment descriptor (soicat version, host, capabilities, ...).
required:
- csrPem
title: NodeEnrollRequest
type: object
EdgeNodeSummary:
description: 'Compact edge-node view for the mission form''s picker (GET /edge-node).
``mission_id`` is the node''s current binding (shown as "currently on Mission X" so a re-bind
isn''t surprising); the enrolled/last-seen stamps let the UI flag a node that isn''t live.'
properties:
citraUserId:
format: uuid
title: Citrauserid
type: string
enrolledAt:
anyOf:
- format: date-time
type: string
- type: 'null'
friendlyName:
title: Friendlyname
type: string
id:
format: uuid
title: Id
type: string
lastSeenAt:
anyOf:
- format: date-time
type: string
- type: 'null'
missionId:
anyOf:
- format: uuid
type: string
- type: 'null'
required:
- id
- friendlyName
- citraUserId
title: EdgeNodeSummary
type: object
NodeEnrollResponse:
description: 'Node leaf package returned to a successfully enrolled node.
The node combines `leaf_cert_pem` + its locally-held private key into its local NATS leaf-node
config and dials `edge_leaf_url` (the hub LEAFNODE port).'
properties:
caRootPem:
title: Carootpem
type: string
edgeLeafUrl:
title: Edgeleafurl
type: string
edgeNodeId:
title: Edgenodeid
type: string
leafCertChainPem:
title: Leafcertchainpem
type: string
leafCertPem:
title: Leafcertpem
type: string
required:
- leafCertPem
- leafCertChainPem
- caRootPem
- edgeLeafUrl
- edgeNodeId
title: NodeEnrollResponse
type: object
ValidationError:
properties:
ctx:
type: object
input: {}
loc:
items:
oneOf:
- type: string
- format: int64
type: integer
type: array
msg:
type: string
type:
type: string
required:
- loc
- msg
- type
type: object
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
type: object
securitySchemes:
HTTPBearer:
scheme: bearer
type: http