Skip to main content
Submits a new agent to the ServiceNet registry. The submission must include a valid A2A agent card, deployment configuration, a review profile, and a signed provider attestation. By default, submissions that pass all validation checks (signature, schema, and review) are auto-approved and immediately published. Set SERVICENET_REQUIRE_ADMIN_APPROVE=1 on the node to require manual admin approval instead.

Submit an agent

POST /v1/agent-submissions

curl -X POST http://your-node:8042/v1/agent-submissions \
  -H 'content-type: application/json' \
  -d '{
    "provider_id": "acme-labs",
    "agent_id": "stripe-agent",
    "version": "0.1.0",
    "agent_card": {
      "name": "Stripe Agent",
      "description": "Handles Stripe payment flows",
      "url": "https://stripe-agent.example.com",
      "preferredTransport": "JSONRPC",
      "protocolVersion": "1.0",
      "supportsTask": false,
      "skills": [
        {
          "id": "payments.create_link",
          "name": "Create Payment Link",
          "description": "Creates a Stripe payment link"
        }
      ],
      "securitySchemes": { "oauth2": { "type": "oauth2" } },
      "security": [{ "oauth2": ["payments:write"] }]
    },
    "deployment": {
      "runtime": "remote_http",
      "endpoint": {
        "url": "https://stripe-agent.example.com/a2a",
        "protocol_binding": "JSONRPC",
        "protocol_version": "1.0"
      }
    },
    "review": {
      "risk_level": "medium",
      "data_classes": ["financial"],
      "destructive_actions": ["payments.refund"],
      "human_approval_required": true,
      "allowed_regions": ["AU", "US"]
    },
    "artifacts": {
      "documentation_url": "https://stripe-agent.example.com/docs",
      "security_url": "https://stripe-agent.example.com/security"
    },
    "attestations": {
      "attestation_signature": "<ATTESTATION_SIGNATURE>",
      "source_commit": "<COMMIT_SHA>",
      "build_digest": "<BUILD_DIGEST>"
    }
  }'

Body parameters

provider_id
string
required
The provider_id of the registered, active provider submitting this agent.
agent_id
string
required
Unique identifier for this agent (e.g. "stripe-agent"). Must be unique within the provider’s submissions.
version
string
required
Semantic version for this release (e.g. "0.1.0").
agent_card
object
required
A2A-compatible agent card object. Must include name, description, url, preferredTransport, protocolVersion, supportsTask, skills, securitySchemes, and security.
deployment
object
required
Deployment configuration.
review
object
required
Review profile for this agent.
artifacts
object
Optional supporting artifact URLs.
attestations
object
required
Provider attestation proving the submission’s integrity.

Response

Returns the created AgentSubmissionRecord with status 201 Created.
submission_id
string (UUID)
Unique identifier for this submission. Use it to query status or approve/reject via the admin API.
provider_id
string
The submitting provider’s identifier.
agent_id
string
The agent identifier.
version
string
The submitted version.
status
string
Submission lifecycle status. One of "draft", "submitted", "in_review", "approved", "rejected", "suspended", or "revoked". Auto-approved submissions will be "approved".
agent_card
object
The submitted A2A agent card.
deployment
object
The submitted deployment configuration.
review
AgentReviewProfile
The submitted review profile.
artifacts
AgentArtifacts
The submitted artifact URLs.
attestations
AgentAttestations
The submitted attestation data.
submitted_at
string
ISO 8601 timestamp of submission.
updated_at
string
ISO 8601 timestamp of the most recent status change.
reviewed_by
string
Reviewer identity. Set to "auto-approve" for automatically approved submissions.
review_notes
string
Optional reviewer notes.
rejection_reason
string
Reason for rejection. Present only when status is "rejected".

Status codes

CodeMeaning
201 CreatedSubmission accepted. Returns the AgentSubmissionRecord.
400 Bad RequestMissing required fields, invalid attestation signature, or schema validation failure.
403 ForbiddenThe provider is revoked or blocked.

Example response

{
  "submission_id": "a1b2c3d4-0000-0000-0000-000000000001",
  "provider_id": "acme-labs",
  "agent_id": "stripe-agent",
  "version": "0.1.0",
  "status": "approved",
  "agent_card": { "name": "Stripe Agent", "..." : "..." },
  "deployment": {
    "runtime": "remote_http",
    "endpoint": {
      "url": "https://stripe-agent.example.com/a2a",
      "protocol_binding": "JSONRPC",
      "protocol_version": "1.0",
      "interaction_protocol": "google_a2a"
    }
  },
  "review": {
    "risk_level": "medium",
    "data_classes": ["financial"],
    "destructive_actions": ["payments.refund"],
    "human_approval_required": true,
    "allowed_regions": ["AU", "US"]
  },
  "artifacts": {
    "documentation_url": "https://stripe-agent.example.com/docs"
  },
  "attestations": {
    "attestation_signature": "<ATTESTATION_SIGNATURE>",
    "source_commit": "abc123"
  },
  "submitted_at": "2025-01-16T07:55:00Z",
  "updated_at": "2025-01-16T07:55:01Z",
  "reviewed_by": "auto-approve"
}

List submissions

GET /v1/agent-submissions

Retrieve submissions filtered by provider, agent, or status.
curl 'http://your-node:8042/v1/agent-submissions?provider_id=acme-labs&status=approved'

Query parameters

provider_id
string
Filter by provider identifier.
agent_id
string
Filter by agent identifier.
status
string
Filter by submission status. One of "draft", "submitted", "in_review", "approved", "rejected", "suspended", or "revoked".
Returns { "items": AgentSubmissionRecord[] }.

Get a single submission

GET /v1/agent-submissions/:submission_id

curl http://your-node:8042/v1/agent-submissions/a1b2c3d4-0000-0000-0000-000000000001
submission_id
string (UUID)
required
The submission_id returned when the submission was created.
Returns the full AgentSubmissionRecord or 404 Not Found if the submission does not exist.