Skip to main content
Upload a new plugin or new version of existing plugin.

Request

Method: POST Endpoint: /v1/capabilities/upload Content-Type: multipart/form-data
curl -X POST "https://api.noorle.com/v1/capabilities/upload" \
  -H "X-API-Key: ak-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4s9t0u1v2w3x4y5z6" \
  -F "plugin=@my-plugin.npack"

Form Parameters

ParameterTypeRequiredDescription
pluginfileYesThe .npack plugin archive file

Response

{
  "capability_id": "550e8400-e29b-41d4-a716-446655440000",
  "capability_name": "my-plugin",
  "version": 1,
  "files_processed": [
    "plugin.wasm",
    "noorle.yaml",
    "world.wit"
  ],
  "schema_warnings": []
}

Status Codes

CodeMeaning
200Success
400Invalid file format or missing noorle.yaml
401Unauthorized
413File too large (>10MB)

Response Fields

  • capability_id: Unique ID for this plugin
  • capability_name: Name from noorle.yaml
  • version: Version number (auto-incremented for updates)
  • files_processed: Files extracted from archive
  • schema_warnings: Validation warnings (non-fatal)

Examples

First Upload

# Build plugin locally
noorle plugin build

# Upload
curl -X POST "https://api.noorle.com/v1/capabilities/upload" \
  -H "X-API-Key: ak-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4s9t0u1v2w3x4y5z6" \
  -F "plugin=@my-plugin.npack"

# Response:
# {
#   "capability_id": "550e8400-...",
#   "capability_name": "my-plugin",
#   "version": 1
# }

Update Plugin

# Modify code and rebuild
noorle plugin build

# Upload again (same file name)
curl -X POST "https://api.noorle.com/v1/capabilities/upload" \
  -H "X-API-Key: ak-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4s9t0u1v2w3x4y5z6" \
  -F "plugin=@my-plugin.npack"

# Response:
# {
#   "capability_id": "550e8400-...",
#   "capability_name": "my-plugin",
#   "version": 2
# }

File Format

Plugin must be .npack (tar.gz archive) containing:
  • plugin.wasm (required)
  • noorle.yaml (optional, but recommended)
  • world.wit (optional)
  • .env (optional)

Error Examples

Invalid Archive

{
  "error": {
    "code": "invalid_archive",
    "message": "Invalid archive format. Must be gzip-compressed tar"
  }
}

Missing WASM File

{
  "error": {
    "code": "missing_wasm",
    "message": "Archive must contain plugin.wasm"
  }
}

File Too Large

{
  "error": {
    "code": "file_too_large",
    "message": "Plugin size exceeds 10MB limit"
  }
}