solarOS Organization API

Organization API

Create a Case

Creates a first-class service Case for an accessible Customer and linked Property. Requires Idempotency-Key. External References are created transactionally and conflicts return 409. Required scope: cases:write.

/api/v1/cases

Creates a first-class service Case for an accessible Customer and linked Property. Requires Idempotency-Key. External References are created transactionally and conflicts return 409. Required scope: cases:write.

Create a Case. Use an organization API key with cases:write. Check the response envelope and meta.requestId before triggering dependent workflow steps.

Required scopes

cases:writeIdempotency-Key required

Parameters

No path or query parameters.

Request body

objectrequired
FieldTypeDescription
customerIdrequiredstringOptional unless marked required.
propertyIdrequiredstringOptional unless marked required.
systemIdstring | nullOptional unless marked required.
projectIdstring | nullCurrent project compatibility pointer. Changing or clearing it preserves prior Project memberships. Use Project.caseId to link/unlink membership.
subjectrequiredstringOptional unless marked required.
descriptionrequiredstringOptional unless marked required.
originrequiredPHONE | EMAIL | PORTAL | MONITORING_ALERT | IN_PERSONOptional unless marked required.
severityLOW | MEDIUM | HIGH | URGENTOptional unless marked required.
categoryrequiredstringCase Category key. Platform keys: HARDWARE_DEFECT, WORKMANSHIP, MONITORING, BILLING, OTHER. Organizations may add their own; list them with GET /case-categories.
statusOPEN | TRIAGING | IN_PROGRESS | AWAITING_CUSTOMER | AWAITING_VENDOR | AWAITING_WORK | RESOLVED | CLOSEDCLOSED is the sole terminal status. Legacy RESOLVED input is accepted as CLOSED.
ownerIdstring | nullActive or draft same-organization Team Member id. When omitted, the API key default owner for this resource is used. Ownership cannot be changed through generic PATCH endpoints.
sourceServiceRequestIdstringOptional unless marked required.
slaResponseDueAtstringOptional unless marked required.
externalReferences[]array<object>Optional unless marked required.
externalReferences[].externalSystemrequiredstringOptional unless marked required.
externalReferences[].externalObjectrequiredstringOptional unless marked required.
externalReferences[].externalIdrequiredstringOptional unless marked required.
externalReferences[].metadataobjectOptional unless marked required.
createcaseRequest
{
  "customerId": "customer_123",
  "propertyId": "property_123",
  "subject": "Inverter is offline",
  "description": "Monitoring data shows that the inverter stopped reporting this morning.",
  "origin": "MONITORING_ALERT",
  "severity": "MEDIUM",
  "category": "MONITORING"
}

Responses

201

Created Case envelope

#/components/schemas/CaseEnvelope

400

Validation, owner, or idempotency error

#/components/schemas/OrgApiError

401

Missing or invalid organization API key

#/components/schemas/OrgApiError

402

Organization billing access or an endpoint-specific business quota denied the request

#/components/schemas/OrgApiError

403

Missing required scope: cases:write

#/components/schemas/OrgApiError

404

Customer, Property, System, Project, or Service Request not found

#/components/schemas/OrgApiError

409

Idempotency or External Reference conflict

#/components/schemas/OrgApiError

429

Rate limit exceeded

#/components/schemas/OrgApiError

Errors

400 Validation, owner, or idempotency error401 Missing or invalid organization API key402 Organization billing access or an endpoint-specific business quota denied the request403 Missing required scope: cases:write404 Customer, Property, System, Project, or Service Request not found409 Idempotency or External Reference conflict429 Rate limit exceeded

Static examples

curl -X POST "$SOLAROS_BASE_URL/api/v1/cases" \
  -H "Authorization: Bearer $SOLAROS_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SOLAROS_IDEMPOTENCY_KEY" \
  --data '{"customerId":"customer_123","propertyId":"property_123","subject":"Inverter is offline","description":"Monitoring data shows that the inverter stopped reporting this morning.","origin":"MONITORING_ALERT","severity":"MEDIUM","category":"MONITORING"}'