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.
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
Parameters
No path or query parameters.
Request body
| Field | Type | Description |
|---|---|---|
| namerequired | string | Optional unless marked required. |
| caseId | string | null | Optional unless marked required. |
| type | string | Ignored compatibility input. Project Type is retired; use templateId for workflow selection. |
| customerIdrequired | string | Optional unless marked required. |
| propertyIdrequired | string | Optional unless marked required. |
| opportunityId | string | null | Optional unless marked required. |
| quoteId | string | null | Optional unless marked required. |
| templateId | string | null | Optional unless marked required. |
| status | DRAFT | ACTIVE | COMPLETED | CANCELLED | CLOSED | Optional unless marked required. |
| priority | LOW | MEDIUM | HIGH | URGENT | Optional unless marked required. |
| description | string | null | Optional unless marked required. |
| startDate | string | null | Optional unless marked required. |
| targetEndDate | string | null | Optional unless marked required. |
| ownerId | string | null | Active 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. |
| projectScope | object | Optional unless marked required. |
| customFields | object | Field Values keyed by savedIdentity from GET /api/v1/schema. |
| externalReferences[] | array<object> | Optional unless marked required. |
| externalReferences[].externalSystemrequired | string | Optional unless marked required. |
| externalReferences[].externalObjectrequired | string | Optional unless marked required. |
| externalReferences[].externalIdrequired | string | Optional unless marked required. |
| externalReferences[].metadata | object | Optional unless marked required. |
{
"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
Created Project envelope
#/components/schemas/OrgApiResourceEnvelope
Validation, Project Scope, or unsupported template error
#/components/schemas/OrgApiError
Missing or invalid organization API key
#/components/schemas/OrgApiError
Organization billing access or an endpoint-specific business quota denied the request
#/components/schemas/OrgApiError
Missing required scope: projects:write
#/components/schemas/OrgApiError
Customer, Property, Opportunity, or Project Template not found
#/components/schemas/OrgApiError
Idempotency or External Reference conflict
#/components/schemas/OrgApiError
Rate limit exceeded
#/components/schemas/OrgApiError
Errors
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}}'