Citizen portal API for popup city applications (Edge Esmeralda, etc). Handles user registration, OTP authentication, application submission, status tracking, product selection, and payment processing. Used by AI agents to manage popup city living applications.
Full LLM thinking from the 4-phase benchmark pipeline.
```json
{
"service_type": "rest_api",
"base_url": "https://api-citizen-portal.simplefi.tech",
"auth_method": "bearer_token",
"auth_config": {
"header": "Authorization",
"prefix": "Bearer"
},
"endpoints": [
{
"path": "/auth/otp",
"method": "POST",
"purpose": "Request OTP code for authentication",
"params": {
"email": {
"type": "string",
"required": true
}
},
"response_format": "json",
"is_primary": true
},
{
"path": "/auth/login",
"method": "POST",
"purpose": "Login with email and OTP code to get JWT token",
"params": {
"email": {
"type": "string",
"required": true
},
"otp_code": {
"type": "string",
"required": true
}
},
"response_format": "json",
"is_primary": true
},
{
"path": "/applications",
"method": "POST",
"purpose": "Submit a popup city application",
"params": {
"email": {
"type": "string",
"required": true
},
"last_name": {
"type": "string",
"required": true
},
"first_name": {
"type": "string",
"required": true
},
"popup_city_id": {
"type": "integer",
"required": true
}
},
"response_format": "json",
"is_primary": true
},
{
"path": "/applications",
"method": "GET",
"purpose": "Query applications by citizen and popup city",
"params": {
"citizen_id": {
"type": "integer",
"required": false
},
"popup_city_id": {
"type": "integer",
"required": false
}
},
"response_format": "json",
"is_primary": false
}
],
"pricing_model": {
"type": "unknown",
"details": {},
"free_tier": null,
"paid_tiers": []
},
"rate_limits": {
"rpm": 60,
"tpm": null,
"daily": null,
"concurrent": null
},
"capabilities": [
"citizen_authentication",
"popup_city_applications",
"application_management",
"otp_verification"
],
"agent_readiness": {
"supports_x402": false,
"supports_streaming": false,
"has_sandbox": false,
"sdks": [],
"agent_auth_methods": ["email_signup"]
}
}
```
```json
{
"tests": [
{
"name": "test_otp_request",
"endpoint": "/auth/otp",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"payload": {
"email": "test@example.com"
},
"expected_status": 200,
"expected_behavior": "Returns success message for OTP request",
"metrics": ["latency", "status_code", "response_time"],
"validation": {
"check_response_structure": true,
"expect_json": true
}
},
{
"name": "test_login_structure",
"endpoint": "/auth/login",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"payload": {
"email": "test@example.com",
"otp_code": "123456"
},
"expected_status": [400, 401, 422],
"expected_behavior": "Returns error for invalid OTP (tests endpoint structure)",
"metrics": ["latency", "error_handling", "status_code"],
"validation": {
"expect_json": true,
"check_error_format": true
}
},
{
"name": "test_applications_submit_unauthorized",
"endpoint": "/applications",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"payload": {
"email": "citizen@example.com",
"first_name": "John",
"last_name": "Doe",
"popup_city_id": 1
},
"expected_status": [401, 403],
"expected_behavior": "Returns unauthorized error without valid token",
"metrics": ["latency", "error_handling", "status_code"],
"validation": {
"expect_json": true,
"check_auth_required": true
}
},
{
"name": "test_applications_query",
"endpoint": "/applications",
"method": "GET",
"headers": {
"Content-Type": "application/json"
},
"payload": {},
"expected_status": [200, 401, 403],
"expected_behavior": "Returns applications or auth error",
"metrics": ["latency", "status_code"],
"validation": {
"expect_json": true
}
},
{
"name": "test_applications_query_with_params",
"endpoint": "/applications?popup_city_id=1",
"method": "GET",
"headers": {
"Content-Type": "application/json"
},
"payload": {},
"expected_status": [200, 401, 403],
"expected_behavior": "Returns filtered applications or auth error",
"metrics": ["latency", "status_code"],
"validation": {
"expect_json": true
}
},
{
"name": "test_invalid_endpoint",
"endpoint": "/nonexistent",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 404,
"expected_behavior": "Returns 404 for invalid endpoints",
"metrics": ["error_handling", "status_code"],
"validation": {
"expect_404": true
}
},
{
"name": "test_otp_missing_email",
"endpoint": "/auth/otp",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"payload": {},
"expected_status": [400, 422],
"expected_behavior": "Returns validation error for missing required field",
"metrics": ["error_handling", "status_code"],
"validation": {
"expect_json": true,
"check_validation_error": true
}
},
{
"name": "test_application_invalid_data",
"endpoint": "/applications",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"payload": {
"email": "invalid-email",
"popup_city_id": "not-a-number"
},
"expected_status": [400, 422],
"expected_behavior": "Returns validation error for invalid data types",
"metrics": ["error_handling", "status_code"],
"validation": {
"expect_json": true,
"check_validation_error": true
}
}
],
"pricing_probes": [
{
"name": "check_rate_limit_headers",
"description": "Check if API returns rate limiting headers",
"endpoint": "/auth/otp",
"method": "POST",
"payload": {
"email": "test@example.com"
},
"check": "response.headers should include rate limiting info like X-RateLimit-*"
},
{
"name": "verify_usage_tracking",
"description": "Check if API tracks usage in response headers or body",
"endpoint": "/applications",
"method": "GET",
"payload": {},
"check": "response.headers or body should indicate usage tracking"
}
],
"stress_profile": {
"concurrent_requests": 3,
"duration_seconds": 8,
"ramp_up": true,
"max_rpm": 50,
"note": "Respecting 60 RPM limit with safety margin"
}
}
```
0/8 tests passed
| Test | Endpoint | Status | Latency |
|---|---|---|---|
| test_otp_request | POST /auth/otp | 404 | 87ms |
| test_login_structure | POST /auth/login | 404 | 22ms |
| test_applications_submit_unauthorized | POST /applications | 401 | 23ms |
| test_applications_query | GET /applications | 401 | 22ms |
| test_applications_query_with_params | GET /applications?popup_city_id=1 | 401 | 22ms |
| test_invalid_endpoint | GET /nonexistent | 404 | 22ms |
| test_otp_missing_email | POST /auth/otp | 404 | 22ms |
| test_application_invalid_data | POST /applications | 401 | 22ms |
{"multi_model": true, "models_used": ["openai", "claude_cli"], "model_scores": {"GPT-4o": {"overall": 15, "dimensions": {"token_efficiency": 5.0, "first_try_success": 1.0, "response_parseability": 10.0, "error_clarity": 6.0, "doc_quality": 1.0, "auth_simplicity": 1.0, "latency": 10.0, "consistency": 10.0}}, "Claude CLI": {"overall": 15, "dimensions": {"token_efficiency": 3.0, "first_try_success": 0.0, "response_parseability": 9.0, "error_clarity": 8.0, "doc_quality": 5.0, "auth_simplicity": 1.0, "latency": 10.0, "consistency": 10.0}}}, "averaged": true}Full-stack popup city application management for AI agents. OTP-based auth, application submission, status tracking, and payment processing — all via REST API. Powers the Edge Esmeralda and other popup city experiences.
Show your live agent-readiness score on your own site. Free, no auth — it updates as your score changes.
<a href="https://prowl.world/service/edgeos-openclaw-api">
<img src="https://prowl.world/badge/edgeos-openclaw-api.svg" height="56" alt="Agent-readiness on Prowl">
</a>
See operational metrics, LLM evaluations, agent readiness, and more.
Open in Dashboard