Admin API Reference
The Calimero Admin API provides programmatic access to manage various aspects of a Calimero node. This API is essential for building administrative tools, monitoring systems, and integrating Calimero nodes into existing infrastructure.
Base URL
All admin API endpoints are served under the /admin-api
path:
http://your-node-address:port/admin-api
Authentication
The admin API supports session-based authentication. When enabled, endpoints require valid authentication credentials.
Response Format
All API responses follow a consistent JSON format:
{
"payload": {
// Response data here
}
}
Error responses include an error message:
{
"error": "Error description"
}
Endpoints
Health Check
GET /admin-api/health
Check if the admin API is running and healthy.
Response:
{
"payload": {
"data": {
"status": "alive"
}
}
}
Authentication Status
GET /admin-api/is-authed
Check if the current request is authenticated.
Response:
{
"payload": {
"data": {
"is_authed": true
}
}
}
SSL Certificate
GET /admin-api/certificate
Retrieve the SSL certificate for the node.
Response:
{
"payload": {
"data": {
"certificate": "-----BEGIN CERTIFICATE-----\n..."
}
}
}
Application Management
The admin API endpoints for application management provide the same
functionality as the meroctl
CLI tool. Both support installing applications
from local file paths and remote URLs.
Install Application
POST /admin-api/install-application
Install a new application on the node. This endpoint requires a publicly accessible HTTP/HTTPS URL for the WASM file.
Request Body:
Example with descriptive placeholders:
{
"url": "https://example.com/application.wasm",
"metadata": [],
"hash": "optional-hash-value"
}
Example with realistic dummy values:
{
"url": "https://github.com/calimero/example-app/releases/v1.0.0/app.wasm",
"metadata": [],
"hash": "8BtADbnT4DyX6P7rYjKh2trR5zk3nk5L5zSp4G7rHArc"
}
Required Fields:
url
: HTTP/HTTPS URL to the WASM file (local file paths are not supported)metadata
: Array of bytes (can be empty[]
for basic installation)
Optional Fields:
hash
: Optional hash verification for the WASM file
Response:
{
"data": {
"applicationId": "HiHvjUJwQEAJKYr9yaTUPcNQi8BfBdnBWEVGqVFNHFF"
}
}
Important: The url
field must be a valid HTTP/HTTPS URL. Local file paths
(/path/to/file.wasm
) and file protocol URLs (file:///path/to/file.wasm
) are
not supported for security reasons.
Testing with Local Files: To test with local WASM files, you need to serve them via a local HTTP server first:
# Start a local HTTP server in the directory containing your WASM file
cd /path/to/your/wasm/files
python3 -m http.server 8000
# Then use the HTTP URL in your request
curl -X POST http://localhost:2428/admin-api/install-application \
-H "Content-Type: application/json" \
-d '{
"url": "http://localhost:8000/your-app.wasm",
"metadata": []
}'
Install Development Application
POST /admin-api/install-dev-application
Install a development version of an application. This endpoint supports both local file paths and remote URLs.
Request Body:
Example with descriptive placeholders:
{
"path": "/path/to/dev-application.wasm",
"metadata": []
}
Example with realistic dummy values:
{
"path": "/Users/developer/projects/my-app/target/wasm32-unknown-unknown/release/app.wasm",
"metadata": []
}
Alternative Request Body (URL-based):
Example with descriptive placeholders:
{
"path": "https://example.com/dev-application.wasm",
"metadata": []
}
Example with realistic dummy values:
{
"path": "https://github.com/calimero/example-app/releases/nightly/app.wasm",
"metadata": []
}
Similar to the main install endpoint, the path
field accepts both local file
paths and remote URLs for development applications.
Working Examples
Example 1: Install Application from Local HTTP Server
# Step 1: Start a local HTTP server
cd /path/to/your/wasm/files
python3 -m http.server 8000
# Step 2: Install the application
curl -X POST http://localhost:2428/admin-api/install-application \
-H "Content-Type: application/json" \
-d '{
"url": "http://localhost:8000/your-app.wasm",
"metadata": []
}'
Expected Response:
{
"data": {
"applicationId": "HiHvjUJwQEAJKYr9yaTUPcNQi8BfBdnBWEVGqVFNHFF"
}
}
Example 2: Install Application from Remote URL
curl -X POST http://localhost:2428/admin-api/install-application \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/application.wasm",
"metadata": []
}'
Example 3: Install with Metadata (Advanced)
# If you need to include metadata, encode it as bytes
curl -X POST http://localhost:2428/admin-api/install-application \
-H "Content-Type: application/json" \
-d '{
"url": "http://localhost:8000/your-app.wasm",
"metadata": [99, 117, 114, 98],
"hash": "optional-hash-here"
}'
Understanding Metadata
The metadata
field allows you to attach additional information to your
application installation. While optional, it's useful for tracking application
details and displaying information in the admin dashboard.
Metadata Structure
The admin dashboard uses this metadata structure:
interface AppMetadata {
applicationUrl: string; // URL where the WASM file is hosted
applicationName: string; // Human-readable name of the application
applicationOwner: string; // Name of the developer/owner
applicationVersion: string; // Version number (e.g., "1.0.0")
description: string; // Brief description of the application
contractAppId: string; // Optional contract identifier
repositoryUrl: string; // Link to source code repository
}
How Metadata Gets Encoded
The metadata must be provided as an array of bytes (0-255 values). The admin dashboard automatically handles this encoding:
function createAppMetadata(application: AppMetadata): Uint8Array {
return new TextEncoder().encode(JSON.stringify(application));
}
Metadata Examples
Example 1: Empty Metadata (Simplest)
{
"url": "http://localhost:8000/app.wasm",
"metadata": []
}
Example 2: Basic Metadata (Name and Version)
{
"url": "http://localhost:8000/app.wasm",
"metadata": [
123, 34, 110, 97, 109, 101, 34, 58, 34, 67, 117, 114, 98, 32, 65, 112, 112,
34, 44, 34, 118, 101, 114, 115, 105, 111, 110, 34, 58, 34, 49, 46, 48, 46,
48, 34, 125
]
}
This represents: {"name":"Curb App","version":"1.0.0"}
Example 3: Full Metadata Structure
{
"url": "http://localhost:8000/app.wasm",
"metadata": [
123, 34, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 78, 97, 109,
101, 34, 58, 34, 67, 117, 114, 98, 32, 67, 104, 97, 116, 34, 44, 34, 97,
112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 79, 119, 110, 101, 114, 34,
58, 34, 65, 110, 116, 111, 110, 34, 44, 34, 97, 112, 112, 108, 105, 99, 97,
116, 105, 111, 110, 86, 101, 114, 115, 105, 111, 110, 34, 58, 34, 49, 46,
48, 46, 48, 34, 44, 34, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111,
110, 34, 58, 34, 76, 111, 99, 97, 108, 32, 116, 101, 115, 116, 32, 105, 110,
115, 116, 97, 108, 108, 97, 116, 105, 111, 110, 34, 125
]
}
This represents:
{"applicationName":"Curb Chat","applicationOwner":"Anton","applicationVersion":"1.0.0","description":"Local test installation"}
How to Generate Metadata Bytes
Option 1: Use JavaScript/Node.js
const metadata = {
applicationName: 'My App',
applicationVersion: '1.0.0',
};
const bytes = Array.from(new TextEncoder().encode(JSON.stringify(metadata)));
console.log(bytes); // [123, 34, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 78, 97, 109, 101, 34, 58, 34, 77, 121, 32, 65, 112, 112, 34, 44, 34, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 86, 101, 114, 115, 105, 111, 110, 34, 58, 34, 49, 46, 48, 46, 48, 34, 125]
Option 2: Use Online Tools
- Convert your JSON to bytes using online text-to-bytes converters
- Or use the admin dashboard which handles encoding automatically
When to Use Metadata
- Empty
[]
: For quick testing and basic installations - Basic metadata: When you want to track app name and version
- Full metadata: For production deployments where you need complete app information
Metadata Best Practices
- Keep it simple: Start with empty metadata for testing
- Use consistent naming: Follow the same structure across applications
- Include essential info: At minimum, include
applicationName
andapplicationVersion
- Avoid sensitive data: Don't include API keys, passwords, or private information
List Applications
GET /admin-api/applications
Get a list of all installed applications.
Troubleshooting Common Issues
Issue: "Failed to deserialize the JSON body into the target type: missing field url
"
Cause: Using path
instead of url
field Solution: Use url
field for
the install endpoint:
{
"url": "http://example.com/app.wasm",
"metadata": []
}
Issue: "Failed to deserialize the JSON body into the target type: metadata: invalid type: map, expected a sequence"
Cause: Metadata should be an array, not an object Solution: Use array format:
{
"url": "http://example.com/app.wasm",
"metadata": []
}
Issue: "Failed to deserialize the JSON body into the target type: metadata[0]: invalid type: string, expected u8"
Cause: Metadata array should contain numbers (0-255), not strings Solution: Use empty array or encode strings as byte values:
{
"url": "http://example.com/app.wasm",
"metadata": []
}
Issue: "HTTP 404 Not Found" on /admin-api/install-dev-application
Cause: The dev endpoint may not be available on your node version Solution: Use the regular install endpoint with an HTTP URL instead
Issue: "relative URL without a base" or "file:// protocol not supported"
Cause: Local file paths and file:// URLs are not supported Solution: Serve your WASM file via HTTP server:
# Start local HTTP server
cd /path/to/wasm/files
python3 -m http.server 8000
# Use HTTP URL
curl -X POST http://localhost:2428/admin-api/install-application \
-H "Content-Type: application/json" \
-d '{
"url": "http://localhost:8000/app.wasm",
"metadata": []
}'
Issue: "error sending request for url" or "builder error for url"
Cause: The URL is not accessible or the web server is not running Solution:
- Verify the web server is running
- Test URL accessibility:
curl http://localhost:8000/app.wasm
- Check firewall/network settings
Issue: App installed but not visible in admin dashboard
Cause: Dashboard may be pointing to different node or have connection issues Solution:
- Verify app exists via CLI:
meroctl --node node1 app list
- Check dashboard node configuration
- Verify dashboard can access the admin API
Response:
{
"payload": {
"data": [
{
"id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"name": "My Application",
"version": "1.0.0",
"installed_at": "2024-01-01T00:00:00Z"
}
]
}
}
Get Application
GET /admin-api/applications/:application_id
Get details of a specific application.
Response:
{
"payload": {
"data": {
"id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"name": "My Application",
"version": "1.0.0",
"installed_at": "2024-01-01T00:00:00Z",
"contexts_count": 5
}
}
}
Uninstall Application
DELETE /admin-api/applications/:application_id
Remove an application from the node.
Response:
{
"payload": {
"data": {
"success": true,
"message": "Application uninstalled successfully"
}
}
}
Context Management
Create Context
POST /admin-api/contexts
Create a new context.
Request Body:
Example with descriptive placeholders:
{
"application_id": "application_identity_hash",
"name": "context_name",
"protocol": "near"
}
Example with realistic dummy values:
{
"application_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"name": "My Context",
"protocol": "near"
}
Response:
{
"payload": {
"data": {
"context_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"name": "My Context",
"application_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"created_at": "2024-01-01T00:00:00Z"
}
}
}
List Contexts
GET /admin-api/contexts
Get a list of all contexts.
Response:
{
"payload": {
"data": [
{
"id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"name": "My Context",
"application_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"created_at": "2024-01-01T00:00:00Z",
"members_count": 3
}
]
}
}
Get Context
GET /admin-api/contexts/:context_id
Get details of a specific context.
Response:
{
"payload": {
"data": {
"id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"name": "My Context",
"application_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"created_at": "2024-01-01T00:00:00Z",
"members": [
{
"identity": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"alias": "alice",
"capabilities": ["read", "write"]
}
]
}
}
}
Delete Context
DELETE /admin-api/contexts/:context_id
Delete a context and all its data.
Response:
{
"payload": {
"data": {
"success": true,
"message": "Context deleted successfully"
}
}
}
Invite to Context
POST /admin-api/contexts/invite
Invite a peer to join a context.
Request Body:
Example with descriptive placeholders:
{
"context_id": "context_identity_hash",
"invitee_identity": "invitee_public_key",
"inviter_identity": "inviter_identity_hash"
}
Example with realistic dummy values:
{
"context_id": "A4NyeJydZYKeSDiDV4CHYADVGywVekWEubi47Syf6FQy",
"invitee_identity": "57kiq6jgag3iL7vp4D5iwFLnecB4sig9sP6ELJLv87tL",
"inviter_identity": "3aipBNQaNzkWeMrSTzWwAQRdfWvwvFXqSKCZ1CBT8d4k"
}
Note: This endpoint corresponds to the CLI command
meroctl context invite {invitee_identity} --as {inviter_identity} -c {context_id}
.
The invitee_identity
is the public key of the person being invited,
inviter_identity
is the identity of the person doing the inviting, and
context_id
specifies which context to invite them to.
Join Context
POST /admin-api/contexts/join
Accept an invitation to join a context.
Request Body:
Example with descriptive placeholders:
{
"invitation_payload": "base64_encoded_invitation_payload"
}
Example with realistic dummy values:
{
"invitation_payload": "maWT6kDxpR1EMXb2YSXzdHkegU76QVcf3yXUAyDUEQ27nuHJkpYQbyota6BpZbaouxDn1biAywcj2GnUSRurDn2mvjMwuo6WrjvvgvvAUGDKmAtzN7oqhtWVt5cGEucgrZaei7S255e1KXikmFHWN8UPKMBkuWVFq"
}
Note: This endpoint corresponds to the CLI command
meroctl context join {invitation_payload}
. The invitation_payload
is the
result of a successful context invite operation and contains all the necessary
information to join the context, including the context ID and invitation
details.
Update Context Application
POST /admin-api/contexts/:context_id/application
Update the application associated with a context.
Request Body:
{
"application_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf"
}
Get Context Storage
GET /admin-api/contexts/:context_id/storage
Get the raw storage data for a context.
Response:
{
"payload": {
"data": {
"entries": [
{
"key": "user:alice",
"value": "encrypted_data_here"
}
],
"total_size": 1024
}
}
}
Get Context Identities
GET /admin-api/contexts/:context_id/identities
Get all identities in a context.
Response:
{
"payload": {
"data": [
{
"identity": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"alias": "alice",
"capabilities": ["read", "write"],
"joined_at": "2024-01-01T00:00:00Z"
}
]
}
}
Get Owned Context Identities
GET /admin-api/contexts/:context_id/identities-owned
Get only the identities owned by the current user in a context.
Response:
{
"payload": {
"data": [
{
"identity": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"alias": "alice",
"capabilities": ["read", "write"],
"joined_at": "2024-01-01T00:00:00Z"
}
]
}
}
Grant Capabilities
POST /admin-api/contexts/:context_id/capabilities/grant
Grant capabilities to an identity in a context.
Request Body:
{
"identity": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"capabilities": ["read", "write", "admin"]
}
Revoke Capabilities
POST /admin-api/contexts/:context_id/capabilities/revoke
Revoke capabilities from an identity in a context.
Request Body:
{
"identity": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"capabilities": ["admin"]
}
Identity Management
Generate Context Identity
POST /admin-api/identity/context
Generate a new identity for use in a context.
Request Body:
{
"context_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf"
}
Response:
{
"payload": {
"data": {
"identity": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"private_key": "base64_encoded_private_key"
}
}
}
Proposal Management
Get Active Proposals Count
GET /admin-api/contexts/:context_id/proposals/count
Get the number of active proposals in a context.
Response:
{
"payload": {
"data": {
"count": 5
}
}
}
Get Proposals
POST /admin-api/contexts/:context_id/proposals
Get a list of proposals in a context.
Request Body:
{
"limit": 10,
"offset": 0,
"status": "active"
}
Response:
{
"payload": {
"data": [
{
"id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"title": "Update Protocol",
"status": "active",
"created_by": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"created_at": "2024-01-01T00:00:00Z"
}
]
}
}
Get Proposal
GET /admin-api/contexts/:context_id/proposals/:proposal_id
Get details of a specific proposal.
Response:
{
"payload": {
"data": {
"id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"title": "Update Protocol",
"description": "Update to latest protocol version",
"status": "active",
"created_by": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"created_at": "2024-01-01T00:00:00Z",
"approvals_count": 3,
"required_approvals": 5
}
}
}
Get Proposal Approvals Count
GET /admin-api/contexts/:context_id/proposals/:proposal_id/approvals/count
Get the number of approvals for a proposal.
Response:
{
"payload": {
"data": {
"count": 3,
"required": 5
}
}
}
Get Proposal Approvers
GET /admin-api/contexts/:context_id/proposals/:proposal_id/approvals/users
Get the list of users who approved a proposal.
Response:
{
"payload": {
"data": [
{
"identity": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"alias": "alice",
"approved_at": "2024-01-01T00:00:00Z"
}
]
}
}
Get Context Value
POST /admin-api/contexts/:context_id/proposals/get-context-value
Get a specific value from the context storage.
Request Body:
{
"key": "user:alice"
}
Get Context Storage Entries
POST /admin-api/contexts/:context_id/proposals/context-storage-entries
Get multiple storage entries from a context.
Request Body:
{
"keys": ["user:alice", "user:bob"],
"limit": 100
}
Get Proxy Contract
GET /admin-api/contexts/:context_id/proxy-contract
Get the proxy contract information for a context.
Response:
{
"payload": {
"data": {
"contract_address": "0x1234...",
"network": "ethereum",
"status": "active"
}
}
}
Context Synchronization
Sync Context
POST /admin-api/contexts/sync
Synchronize a context with the network.
Request Body:
{
"context_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf"
}
POST /admin-api/contexts/sync/:context_id
Synchronize a specific context.
Network Information
Get Peers Count
GET /admin-api/peers
Get the number of connected peers.
Response:
{
"payload": {
"data": {
"count": 15,
"active": 12
}
}
}
Blob Management
Upload Blob
PUT /admin-api/blobs
Upload a new blob to the node.
Request Body: Binary data
Headers:
Content-Type: application/octet-stream
Response:
{
"payload": {
"data": {
"blob_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"size": 1024,
"uploaded_at": "2024-01-01T00:00:00Z"
}
}
}
List Blobs
GET /admin-api/blobs
Get a list of all blobs.
Response:
{
"payload": {
"data": [
{
"id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"size": 1024,
"uploaded_at": "2024-01-01T00:00:00Z"
}
]
}
}
Download Blob
GET /admin-api/blobs/:blob_id
Download a blob by ID.
Response: Binary data
Headers:
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="blob.bin"
Get Blob Info
HEAD /admin-api/blobs/:blob_id
Get metadata about a blob without downloading it.
Response Headers:
Content-Length: 1024
Content-Type: application/octet-stream
X-Uploaded-At: 2024-01-01T00:00:00Z
Delete Blob
DELETE /admin-api/blobs/:blob_id
Delete a blob from the node.
Response:
{
"payload": {
"data": {
"success": true,
"message": "Blob deleted successfully"
}
}
}
Alias Management
Create Alias
POST /admin-api/alias/create/context
Create an alias for a context.
Request Body:
{
"name": "my-context",
"target": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf"
}
POST /admin-api/alias/create/application
Create an alias for an application.
Request Body:
{
"name": "my-app",
"target": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf"
}
POST /admin-api/alias/create/identity/:context
Create an alias for an identity in a context.
Request Body:
{
"name": "alice",
"target": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf"
}
Lookup Alias
POST /admin-api/alias/lookup/context/:name
Look up a context by alias.
Response:
{
"payload": {
"data": {
"target": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"created_at": "2024-01-01T00:00:00Z"
}
}
}
POST /admin-api/alias/lookup/application/:name
Look up an application by alias.
POST /admin-api/alias/lookup/identity/:context/:name
Look up an identity by alias in a specific context.
Delete Alias
POST /admin-api/alias/delete/context/:name
Delete a context alias.
POST /admin-api/alias/delete/application/:name
Delete an application alias.
POST /admin-api/alias/delete/identity/:context/:name
Delete an identity alias.
List Aliases
GET /admin-api/alias/list/context
List all context aliases.
GET /admin-api/alias/list/application
List all application aliases.
GET /admin-api/alias/list/identity/:context
List all identity aliases in a context.
Error Handling
The admin API returns appropriate HTTP status codes and error messages:
- 400 Bad Request: Invalid request parameters
- 401 Unauthorized: Authentication required
- 403 Forbidden: Insufficient permissions
- 404 Not Found: Resource not found
- 500 Internal Server Error: Server-side error
Rate Limiting
The admin API may implement rate limiting to prevent abuse. Check response headers for rate limit information.
WebSocket Support
Some endpoints support WebSocket connections for real-time updates. Check the specific endpoint documentation for WebSocket support details.
Examples
Complete Workflow: Create Context and Invite Users
# 1. Create a context
curl -X POST http://localhost:2428/admin-api/contexts \
-H "Content-Type: application/json" \
-d '{
"application_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf",
"name": "Team Collaboration",
"protocol": "near"
}'
# 2. Generate an identity for the context
curl -X POST http://localhost:2428/admin-api/identity/context \
-H "Content-Type: application/json" \
-d '{
"context_id": "3Hfk2VekXQ58vYHW3hUtA3mh2Rwtb1brV1RKEXtfvfsf"
}'
# 3. Invite a peer to the context
curl -X POST http://localhost:2428/admin-api/contexts/invite \
-H "Content-Type: application/json" \
-d '{
"context_id": "A4NyeJydZYKeSDiDV4CHYADVGywVekWEubi47Syf6FQy",
"invitee_identity": "57kiq6jgag3iL7vp4D5iwFLnecB4sig9sP6ELJLv87tL",
"inviter_identity": "3aipBNQaNzkWeMrSTzWwAQRdfWvwvFXqSKCZ1CBT8d4k"
}'
# 4. Accept the invitation (using the payload from step 3)
curl -X POST http://localhost:2428/admin-api/contexts/join \
-H "Content-Type: application/json" \
-d '{
"invitation_payload": "maWT6kDxpR1EMXb2YSXzdHkegU76QVcf3yXUAyDUEQ27nuHJkpYQbyota6BpZbaouxDn1biAywcj2GnUSRurDn2mvjMwuo6WrjvvgvvAUGDKmAtzN7oqhtWVt5cGEucgrZaei7S255e1KXikmFHWN8UPKMBkuWVFq"
}'
Monitoring Node Health
# Check API health
curl http://localhost:2428/admin-api/health
# Get peer count
curl http://localhost:2428/admin-api/peers
# List all contexts
curl http://localhost:2428/admin-api/contexts
Understanding Metadata
The metadata
field allows you to attach additional information to your
application installation. While optional, it's useful for tracking application
details and displaying information in the admin dashboard.
Metadata Structure
The admin dashboard uses this metadata structure:
interface AppMetadata {
applicationUrl: string; // URL where the WASM file is hosted
applicationName: string; // Human-readable name of the application
applicationOwner: string; // Name of the developer/owner
applicationVersion: string; // Version number (e.g., "1.0.0")
description: string; // Brief description of the application
contractAppId: string; // Optional contract identifier
repositoryUrl: string; // Link to source code repository
}
How Metadata Gets Encoded
The metadata must be provided as an array of bytes (0-255 values). The admin dashboard automatically handles this encoding:
function createAppMetadata(application: AppMetadata): Uint8Array {
return new TextEncoder().encode(JSON.stringify(application));
}
Metadata Examples
Example 1: Empty Metadata (Simplest)
{
"url": "http://localhost:8000/app.wasm",
"metadata": []
}
Example 2: Basic Metadata (Name and Version)
{
"url": "http://localhost:8000/app.wasm",
"metadata": [
123, 34, 110, 97, 109, 101, 34, 58, 34, 67, 117, 114, 98, 32, 65, 112, 112,
34, 44, 34, 118, 101, 114, 115, 105, 111, 110, 34, 58, 34, 49, 46, 48, 46,
48, 34, 125
]
}
This represents: {"name":"Curb App","version":"1.0.0"}
Example 3: Full Metadata Structure
{
"url": "http://localhost:8000/app.wasm",
"metadata": [
123, 34, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 78, 97, 109,
101, 34, 58, 34, 67, 117, 114, 98, 32, 67, 104, 97, 116, 34, 44, 34, 97,
112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 79, 119, 110, 101, 114, 34,
58, 34, 65, 110, 116, 111, 110, 34, 44, 34, 97, 112, 112, 108, 105, 99, 97,
116, 105, 111, 110, 86, 101, 114, 115, 105, 111, 110, 34, 58, 34, 49, 46,
48, 46, 48, 34, 44, 34, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111,
110, 34, 58, 34, 76, 111, 99, 97, 108, 32, 116, 101, 115, 116, 32, 105, 110,
115, 116, 97, 108, 108, 97, 116, 105, 111, 110, 34, 125
]
}
This represents:
{"applicationName":"Curb Chat","applicationOwner":"Anton","applicationVersion":"1.0.0","description":"Local test installation"}
How to Generate Metadata Bytes
Option 1: Use JavaScript/Node.js
const metadata = {
applicationName: 'My App',
applicationVersion: '1.0.0',
};
const bytes = Array.from(new TextEncoder().encode(JSON.stringify(metadata)));
console.log(bytes); // [123, 34, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 78, 97, 109, 101, 34, 58, 34, 77, 121, 32, 65, 112, 112, 34, 44, 34, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 86, 101, 114, 115, 105, 111, 110, 34, 58, 34, 49, 46, 48, 46, 48, 34, 125]
Option 2: Use Online Tools
- Convert your JSON to bytes using online text-to-bytes converters
- Or use the admin dashboard which handles encoding automatically
When to Use Metadata
- Empty
[]
: For quick testing and basic installations - Basic metadata: When you want to track app name and version
- Full metadata: For production deployments where you need complete app information
Metadata Best Practices
- Keep it simple: Start with empty metadata for testing
- Use consistent naming: Follow the same structure across applications
- Include essential info: At minimum, include
applicationName
andapplicationVersion
- Avoid sensitive data: Don't include API keys, passwords, or private information
Troubleshooting Common Issues
Next Steps
- Build Admin Tools: Use these endpoints to create custom administrative interfaces
- Monitor Nodes: Implement monitoring and alerting based on API responses
- Automate Operations: Create scripts for common administrative tasks
- Integration: Connect Calimero nodes to existing infrastructure management systems