Create a project
Creates a project in your organization from one of its project types (discover them via GET /project-types). name and project_type_id are required.
A project created through the API is born fully set up: it is immediately listed, active, and ready for draws — there is no onboarding step to complete. Your organization's Draw Assessment Questions are applied to it automatically.
The optional budget and funding_sources keys set those in the same call — the exact bodies PUT /projects/{projectId}/budget and POST /projects/{projectId}/funding-sources take, under those endpoints' permissions. The create is all-or-nothing: any rejection means no project is created. Without them, the budget and funding sources remain separate, optional steps through those endpoints, before or after creating draws.
Idempotency
This endpoint supports the optional Idempotency-Key header. A key identifies one request (method, path, and body). The key is reserved before the request executes, so a retry that races the original cannot create a duplicate project. Repeating the same request with the same key replays the original response (status and body); until the original has recorded a result, the retry receives 409 with code IDEMPOTENCY_KEY_IN_FLIGHT and should retry after a short backoff. Reusing the key for a different request returns 409 with code IDEMPOTENCY_KEY_CONFLICT.
Once a key has begun executing it is never re-executed automatically. If a request fails before recording a result (e.g. a 5xx), its outcome is unresolved and the key stays in flight rather than being reused — this preserves the guarantee at the cost of that key: do not retry with a new key, which could duplicate; contact support to resolve it. Keys are scoped per service account.
Request
- Base URL: https://api.rabbet.com/v1
- URL: https://api.rabbet.com/v1/projects
- Auth: OAuth 2 (client credentials, token URL https://api.rabbet.com/oauth/token, scopes: write)
Headers
Optional client-supplied key making this request idempotent. Reuse the same value (for the same request) to safely retry without creating a duplicate project.
Request body
Example request
{
"name": "Theodore Hotel Austin",
"project_type_id": "e5a0e6db-0367-4d21-b0a4-6a3b3f4c9f2a",
"custom_id": "SANY-4471",
"street_address": "123 Foobar St",
"city": "Austin",
"state": "TX",
"zip": "78757",
"start_date": "2026-04-15",
"team_id": "a3f1c9de-2b47-4f80-9c11-5d2e7a6b8c04",
"budget": {
"divisions": [
{
"name": "Hard Costs",
"line_items": [
{
"name": "Concrete",
"amount": {
"amount": "123.45",
"currency": "USD"
},
"number": "03-3000",
"retainage_percentage": 0.1
}
]
}
]
},
"custom_fields": [
{
"id": "b308e77f-6d1d-47c4-bd1f-0069cc548315",
"value": "PN123"
}
],
"funding_sources": [
{
"label": "Senior Loan",
"equity_type": "loan",
"amount": {
"amount": "123.45",
"currency": "USD"
},
"vendor_id": "b7b36587-1c9f-4e2c-a5b0-6f0a4b2f9e11",
"close_date": "2026-01-15",
"maturity_date": "2028-01-15",
"custom_id": "GL-1100-042"
}
]
}Response
Project created (or original response replayed for a reused Idempotency-Key).
Example response
{
"data": {
"id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
"name": "Theodore Hotel Austin",
"custom_id": "SANY-4471",
"street_address": "123 Foobar St",
"city": "Austin",
"state": "TX",
"zip": "78757",
"start_date": "2026-04-15",
"status": "active",
"project_type_id": "e5a0e6db-0367-4d21-b0a4-6a3b3f4c9f2a",
"team_id": "a3f1c9de-2b47-4f80-9c11-5d2e7a6b8c04",
"custom_fields": [
{
"id": "b308e77f-6d1d-47c4-bd1f-0069cc548315",
"label": "Project Number",
"field_name": "loan_id",
"type": "text",
"value": "PN123"
}
],
"draw_assessment_questions": [
{
"id": "b308e77f-6d1d-47c4-bd1f-0069cc548315",
"label": "Site Progress",
"description": "Describe the current site progress",
"field_name": "ta_group",
"field_type": "text"
}
]
}
}Changes
No recorded changes to this operation across all 1 revision of this API.