Skip to main content

Authorization API

The WL-APDP Authorization API provides endpoints for policy-based authorization decisions.

Base URL

http://localhost:8081

Authentication

Currently, the API does not require authentication for authorization requests. Enterprise deployments can enable API key authentication.

Endpoints Overview

EndpointMethodDescription
/authorizePOSTEvaluate authorization request
/policiesGETList all policies
/policiesPOSTCreate a new policy
/policies/:idGETGet policy by ID
/policies/:idDELETEDelete policy
/policies/validateGETValidate all policies
/policies/validate/singlePOSTValidate a single policy
/policies/metadataGETGet policy metadata
/policies/analyzePOSTAnalyze which policies apply
/healthGETHealth check
/readyGETReadiness check
/statusGETDetailed status

Authorization

POST /authorize

Evaluate an authorization request against loaded policies.

Request Body:

{
"principal": "User::\"alice\"",
"action": "Action::\"read\"",
"resource": "Document::\"report-2024\"",
"context": {
"intent": "summarize document",
"goal": "quarterly reporting",
"delegation_chain": [
{
"from": "User::\"alice\"",
"to": "Agent::\"assistant\""
}
]
}
}

Response:

{
"decision": "allow",
"reasons": [
{
"policy_id": "user-document-access",
"description": "Users can read their own documents"
}
],
"diagnostics": {
"policies_evaluated": 5,
"policies_applicable": 2,
"evaluation_time_ms": 3
}
}

Status Codes:

CodeDescription
200Authorization decision returned
400Invalid request format
500Internal server error

Policies

GET /policies

List all policies.

Response:

{
"policies": [
{
"id": "admin-full-access",
"name": "Admin Full Access",
"code": "permit(principal in Group::\"admins\", action, resource);",
"description": "Admins have full access",
"active": true,
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
]
}

POST /policies

Create a new policy.

Request Body:

{
"id": "new-policy",
"name": "New Policy",
"code": "permit(principal == User::\"bob\", action, resource);",
"description": "Allow Bob access to everything",
"active": true,
"created_at": "2024-01-15T00:00:00Z",
"updated_at": "2024-01-15T00:00:00Z"
}

Response: Created policy object

Status Codes:

CodeDescription
201Policy created
400Invalid policy format or Cedar syntax error
409Policy ID already exists

GET /policies/:id

Get a specific policy by ID.

Response: Policy object

Status Codes:

CodeDescription
200Policy found
404Policy not found

DELETE /policies/:id

Delete a policy.

Status Codes:

CodeDescription
204Policy deleted
404Policy not found

Policy Validation

GET /policies/validate

Validate all loaded policies.

Response:

{
"valid": true,
"errors": [],
"warnings": []
}

POST /policies/validate/single

Validate a single policy without saving it.

Request Body:

{
"code": "permit(principal == User::\"alice\", action, resource);"
}

Response:

{
"valid": true,
"errors": [],
"parsed_policy": {
"effect": "permit",
"principal_constraint": "User::\"alice\"",
"action_constraint": "*",
"resource_constraint": "*"
}
}

Policy Analysis

GET /policies/metadata

Get metadata for all policies (used for intelligent selection).

Response:

{
"metadata": [
{
"policy_id": "admin-access",
"principal_pattern": "Group::admins",
"action_pattern": "*",
"resource_pattern": "*",
"context_requirements": [],
"complexity_score": 1
}
]
}

POST /policies/analyze

Analyze which policies would apply to a given request.

Request Body:

{
"principal": "Agent::\"bot\"",
"action": "Action::\"execute\"",
"resource": "Tool::\"search\"",
"context": {
"intent": "search_web"
}
}

Response:

{
"total_policies": 50,
"applicable_policies": 3,
"policies": [
{
"id": "agent-tool-access",
"name": "Agent Tool Access",
"would_match": true,
"match_reasons": ["Principal is Agent", "Action is execute", "Resource is Tool"]
}
]
}

Health Checks

GET /health

Basic health check.

Response:

{
"status": "healthy"
}

GET /ready

Readiness check (includes policy validation).

Response:

{
"status": "ready",
"policies_loaded": 25,
"policies_valid": true
}

GET /status

Detailed server status.

Response:

{
"status": "running",
"version": "1.0.0",
"uptime_seconds": 3600,
"policies": {
"total": 25,
"active": 23,
"inactive": 2
},
"metrics": {
"requests_total": 10000,
"requests_allowed": 9500,
"requests_denied": 500,
"avg_latency_ms": 5
}
}

Error Responses

All error responses follow this format:

{
"error": "InvalidRequest",
"message": "Principal format is invalid",
"details": {
"field": "principal",
"value": "invalid-format"
}
}

Rate Limits

Default rate limits (configurable):

EndpointLimit
/authorize10,000 req/min
/policies100 req/min
Other1,000 req/min

OpenAPI Specification

The full OpenAPI specification is available at:

  • /openapi.json - JSON format
  • /openapi.yaml - YAML format

Interactive API explorer coming soon with OpenAPI integration.