solarOS Organization API

Organization API

Create a Project container

Returns canonical caseId. Optional caseId assigns one Case atomically (inherited from quoteId when omitted). Creates a Project for an accessible Customer and linked Property. name, customerId, and propertyId are required. Legacy type is ignored. Creation origin is assigned by the server. Use templateId (not projectTemplateId) for optional Project Template hydration. Arranged Project Scope fields start null unless supplied in projectScope. An answer in projectScope to a Property Field (see isPropertyField) becomes the Property's answer unless the Project is created Completed, Closed or Cancelled, is recorded in its history, and fills that Field on the Property's draft Quotes and open Projects where it is still blank. The created Project is returned with its scope money only for a key that also has quotes:content:read, as GET /v1/projects/{id} returns it. Requires Idempotency-Key and projects:write.

/api/v1/projects

Returns canonical caseId. Optional caseId assigns one Case atomically (inherited from quoteId when omitted). Creates a Project for an accessible Customer and linked Property. name, customerId, and propertyId are required. Legacy type is ignored. Creation origin is assigned by the server. Use templateId (not projectTemplateId) for optional Project Template hydration. Arranged Project Scope fields start null unless supplied in projectScope. An answer in projectScope to a Property Field (see isPropertyField) becomes the Property's answer unless the Project is created Completed, Closed or Cancelled, is recorded in its history, and fills that Field on the Property's draft Quotes and open Projects where it is still blank. The created Project is returned with its scope money only for a key that also has quotes:content:read, as GET /v1/projects/{id} returns it. Requires Idempotency-Key and projects:write.

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

Required scopes

projects:writeIdempotency-Key required

Parameters

No path or query parameters.

Request body

objectrequired
FieldTypeDescription
namerequiredstringOptional unless marked required.
caseIdstring | nullOptional unless marked required.
typestringIgnored compatibility input. Project Type is retired; use templateId for workflow selection.
customerIdrequiredstringOptional unless marked required.
propertyIdrequiredstringOptional unless marked required.
opportunityIdstring | nullOptional unless marked required.
quoteIdstring | nullOptional unless marked required.
templateIdstring | nullOptional unless marked required.
statusDRAFT | ACTIVE | COMPLETED | CANCELLED | CLOSEDOptional unless marked required.
priorityLOW | MEDIUM | HIGH | URGENTOptional unless marked required.
descriptionstring | nullOptional unless marked required.
startDatestring | nullOptional unless marked required.
targetEndDatestring | nullOptional unless marked required.
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.
projectScopeobjectOptional unless marked required.
customFieldsobjectField Values keyed by savedIdentity from GET /api/v1/schema.
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.
createprojectRequest
{
  "customerId": "customer_123",
  "propertyId": "property_123",
  "opportunityId": "opportunity_123",
  "templateId": "project_template_123",
  "name": "Lovelace residential install",
  "status": "ACTIVE",
  "priority": "MEDIUM",
  "projectScope": {
    "systemSizeKw": 8.4,
    "storageKwh": 13.5
  }
}

Responses

201

Created Project envelope

#/components/schemas/OrgApiResourceEnvelope

400

Validation, Project Scope, or unsupported template 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: projects:write

#/components/schemas/OrgApiError

404

Customer, Property, Opportunity, or Project Template not found

#/components/schemas/OrgApiError

409

Idempotency or External Reference conflict

#/components/schemas/OrgApiError

429

Rate limit exceeded

#/components/schemas/OrgApiError

Errors

400 Validation, Project Scope, or unsupported template error401 Missing or invalid organization API key402 Organization billing access or an endpoint-specific business quota denied the request403 Missing required scope: projects:write404 Customer, Property, Opportunity, or Project Template not found409 Idempotency or External Reference conflict429 Rate limit exceeded

Static examples

curl -X POST "$SOLAROS_BASE_URL/api/v1/projects" \
  -H "Authorization: Bearer $SOLAROS_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SOLAROS_IDEMPOTENCY_KEY" \
  --data '{"customerId":"customer_123","propertyId":"property_123","opportunityId":"opportunity_123","templateId":"project_template_123","name":"Lovelace residential install","status":"ACTIVE","priority":"MEDIUM","projectScope":{"systemSizeKw":8.4,"storageKwh":13.5}}'