> For the complete documentation index, see [llms.txt](https://docs.adaptria.locaria.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.adaptria.locaria.com/client-api/reference/quotes.md).

# 💰 Quotes

### Quote Management

Quotes are provided by Locaria in response to your RFQs. Once an RFQ is submitted, Locaria reviews it and creates a quote with pricing and delivery details.

#### Quote Lifecycle

```
PENDING ──▶ SENT ──▶ ACCEPTED ──▶ CHANGED_TO_PROJECT
  │           │
  │           └──▶ REVISED ──▶ SENT
  │
  └──▶ REJECTED
  └──▶ EXPIRED
  └──▶ CANCELLED
```

#### Status Descriptions

| Status               | Description                  | Actions Available      |
| -------------------- | ---------------------------- | ---------------------- |
| PENDING              | Quote being prepared         | ⏳ Wait                 |
| SENT                 | Quote sent to client         | ✅ Accept, ❌ Decline    |
| REVISED              | Quote revised after feedback | ✅ Accept, ❌ Decline    |
| ACCEPTED             | Quote accepted by client     | ✅ Converted to project |
| REJECTED             | Quote declined by client     | ❌ No further actions   |
| EXPIRED              | Quote expired                | ❌ No further actions   |
| CANCELLED            | Quote cancelled              | ❌ No further actions   |
| CHANGED\_TO\_PROJECT | Quote converted to project   | ✅ Project started      |

#### Quote Actions

* **Accept**: Accept a quote to convert it into an active project
* **Decline**: Reject a quote (optional reason can be provided)
* **Download PDF**: Get a PDF version of the quote for your records

## 📋 List Quotes

> \## List Your Quotes\
> \
> Retrieve a paginated list of quotes accessible to your API credentials.\
> \
> \### Filtering Options\
> \
> \| Parameter | Description |\
> \|-----------|-------------|\
> \| \`status\` | Filter by status (PENDING, SENT, ACCEPTED, etc.) |\
> \| \`search\` | Search by project name or quote number |\
> \| \`page\` | Page number (starts at 1) |\
> \| \`limit\` | Items per page (max 100) |\
> \
> \### Response\
> \
> Returns a summary view of each quote - use \`GET /api/public/v1/quotes/:id\` for full details.

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"💰 Quotes","description":"## Quote Management\n\nQuotes are provided by Locaria in response to your RFQs. Once an RFQ is submitted, Locaria reviews it and creates a quote with pricing and delivery details.\n\n### Quote Lifecycle\n\n```\nPENDING ──▶ SENT ──▶ ACCEPTED ──▶ CHANGED_TO_PROJECT\n  │           │\n  │           └──▶ REVISED ──▶ SENT\n  │\n  └──▶ REJECTED\n  └──▶ EXPIRED\n  └──▶ CANCELLED\n```\n\n### Status Descriptions\n\n| Status | Description | Actions Available |\n|--------|-------------|-------------------|\n| PENDING | Quote being prepared | ⏳ Wait |\n| SENT | Quote sent to client | ✅ Accept, ❌ Decline |\n| REVISED | Quote revised after feedback | ✅ Accept, ❌ Decline |\n| ACCEPTED | Quote accepted by client | ✅ Converted to project |\n| REJECTED | Quote declined by client | ❌ No further actions |\n| EXPIRED | Quote expired | ❌ No further actions |\n| CANCELLED | Quote cancelled | ❌ No further actions |\n| CHANGED_TO_PROJECT | Quote converted to project | ✅ Project started |\n\n### Quote Actions\n\n- **Accept**: Accept a quote to convert it into an active project\n- **Decline**: Reject a quote (optional reason can be provided)\n- **Download PDF**: Get a PDF version of the quote for your records\n"}],"servers":[{"url":"https://api.adaptria.locaria.com","description":"Production Environment"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Api-key","description":"## API Key Authentication\n\nStatic API key obtained from the Adaptria Portal or via `POST /api/credentials/api-keys`.\n\n**How to authenticate**:\n1. Generate an API key from the Adaptria Portal (Settings → API Keys) or ask your admin\n2. Include the key in all requests using the `Api-key` header\n\n**Key format**: `lla_live_<32-character-string>`\n\n**No token exchange needed** — the key is used directly in every request. Revoke or rotate keys from the portal."}},"schemas":{"ListQuotesResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/QuoteListItem"},"description":"List of quotes"},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["success","data","pagination"]},"QuoteListItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the quote"},"quoteNumber":{"type":["string","null"],"description":"Human-readable quote number (null for pending quotes)"},"projectName":{"type":["string","null"],"description":"Project name from the original RFQ"},"projectDescription":{"type":["string","null"],"description":"Project description from the RFQ (when available in list)"},"status":{"type":"string","enum":["PENDING","SENT","SENT_PENDING","REVISED","SENT_REVISED","ACCEPTED","REJECTED","EXPIRED","CANCELLED","CHANGED_TO_PROJECT"],"description":"Quote lifecycle status. Admin/internal API keys receive the same statuses as the main app. Client API keys receive client-facing statuses where `SENT` and `SENT_PENDING` are shown as `PENDING`, and `SENT_REVISED` is shown as `REVISED`.\n\n| Status | Description |\n|--------|-------------|\n| `PENDING` | Quote being prepared |\n| `SENT` | Quote sent to client |\n| `SENT_PENDING` | Quote sent and pending client action (admin/internal view) |\n| `REVISED` | Quote revised after feedback |\n| `SENT_REVISED` | Revised quote sent and pending client action (admin/internal view) |\n| `ACCEPTED` | Quote accepted by client |\n| `REJECTED` | Quote declined by client |\n| `EXPIRED` | Quote expired |\n| `CANCELLED` | Quote cancelled |\n| `CHANGED_TO_PROJECT` | Quote converted to project |\n"},"companyId":{"type":["string","null"],"format":"uuid","description":"Company ID this quote belongs to"},"companyName":{"type":["string","null"],"description":"Company name"},"totalPrice":{"type":["object","null"],"properties":{"amount":{"type":"number","description":"Total price amount"},"currency":{"type":"string","description":"Currency code (ISO 4217)"}},"required":["amount","currency"],"description":"Total quote price (null if not yet calculated)"},"quoteDate":{"type":["string","null"],"format":"date-time","description":"Date when quote was created/sent"},"deadlineForQuote":{"type":["string","null"],"format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Deadline for quote response (from RFQ)"},"projectDueDate":{"type":["string","null"],"format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Project delivery deadline (from RFQ)"},"referenceNumber":{"type":["string","null"],"description":"Client or internal reference number"},"validUntil":{"type":["string","null"],"format":"date-time","description":"Quote validity expiration date"},"createdAt":{"type":"string","format":"date-time","description":"Date and time in ISO 8601 format"},"updatedAt":{"type":["string","null"],"format":"date-time","description":"Date and time in ISO 8601 format"}},"required":["id","quoteNumber","projectName","status","companyId","companyName","totalPrice","quoteDate","deadlineForQuote","projectDueDate"]},"Pagination":{"type":"object","properties":{"page":{"type":"integer","exclusiveMinimum":0,"description":"Current page number (1-indexed)"},"limit":{"type":"integer","exclusiveMinimum":0,"maximum":100,"description":"Number of items per page (max 100)"},"total":{"type":"integer","minimum":0,"description":"Total number of items across all pages"},"totalPages":{"type":"integer","minimum":0,"description":"Total number of pages"},"hasNextPage":{"type":"boolean","description":"Whether there are more pages after the current page"},"hasPrevPage":{"type":"boolean","description":"Whether there are pages before the current page"}},"required":["page","limit","total","totalPages","hasNextPage","hasPrevPage"]}}},"paths":{"/api/public/v1/quotes":{"get":{"summary":"📋 List Quotes","description":"## List Your Quotes\n\nRetrieve a paginated list of quotes accessible to your API credentials.\n\n### Filtering Options\n\n| Parameter | Description |\n|-----------|-------------|\n| `status` | Filter by status (PENDING, SENT, ACCEPTED, etc.) |\n| `search` | Search by project name or quote number |\n| `page` | Page number (starts at 1) |\n| `limit` | Items per page (max 100) |\n\n### Response\n\nReturns a summary view of each quote - use `GET /api/public/v1/quotes/:id` for full details.","tags":["💰 Quotes"],"parameters":[{"schema":{"type":"string","pattern":"^\\d+$","description":"Page number to retrieve (starts from 1). Required."},"required":true,"description":"Page number to retrieve (starts from 1). Required.","name":"page","in":"query"},{"schema":{"type":"string","pattern":"^\\d+$","description":"Number of items per page (max 100). Required."},"required":true,"description":"Number of items per page (max 100). Required.","name":"limit","in":"query"},{"schema":{"type":"string","enum":["PENDING","SENT","SENT_PENDING","REVISED","SENT_REVISED","ACCEPTED","REJECTED","EXPIRED","CANCELLED","CHANGED_TO_PROJECT"],"description":"Filter by quote status."},"required":false,"description":"Filter by quote status.","name":"status","in":"query"},{"schema":{"type":"string","description":"Search by project name or quote number"},"required":false,"description":"Search by project name or quote number","name":"search","in":"query"}],"responses":{"200":{"description":"Quotes retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListQuotesResponse"}}}},"401":{"description":"Authentication required"}}}}}}
````

## 🔍 Get Quote Details

> \## Get Full Quote Details\
> \
> Retrieve complete information about a specific quote, including:\
> \- Quote number and project information\
> \- Pricing details\
> \- Status and dates\
> \- Company information

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"💰 Quotes","description":"## Quote Management\n\nQuotes are provided by Locaria in response to your RFQs. Once an RFQ is submitted, Locaria reviews it and creates a quote with pricing and delivery details.\n\n### Quote Lifecycle\n\n```\nPENDING ──▶ SENT ──▶ ACCEPTED ──▶ CHANGED_TO_PROJECT\n  │           │\n  │           └──▶ REVISED ──▶ SENT\n  │\n  └──▶ REJECTED\n  └──▶ EXPIRED\n  └──▶ CANCELLED\n```\n\n### Status Descriptions\n\n| Status | Description | Actions Available |\n|--------|-------------|-------------------|\n| PENDING | Quote being prepared | ⏳ Wait |\n| SENT | Quote sent to client | ✅ Accept, ❌ Decline |\n| REVISED | Quote revised after feedback | ✅ Accept, ❌ Decline |\n| ACCEPTED | Quote accepted by client | ✅ Converted to project |\n| REJECTED | Quote declined by client | ❌ No further actions |\n| EXPIRED | Quote expired | ❌ No further actions |\n| CANCELLED | Quote cancelled | ❌ No further actions |\n| CHANGED_TO_PROJECT | Quote converted to project | ✅ Project started |\n\n### Quote Actions\n\n- **Accept**: Accept a quote to convert it into an active project\n- **Decline**: Reject a quote (optional reason can be provided)\n- **Download PDF**: Get a PDF version of the quote for your records\n"}],"servers":[{"url":"https://api.adaptria.locaria.com","description":"Production Environment"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Api-key","description":"## API Key Authentication\n\nStatic API key obtained from the Adaptria Portal or via `POST /api/credentials/api-keys`.\n\n**How to authenticate**:\n1. Generate an API key from the Adaptria Portal (Settings → API Keys) or ask your admin\n2. Include the key in all requests using the `Api-key` header\n\n**Key format**: `lla_live_<32-character-string>`\n\n**No token exchange needed** — the key is used directly in every request. Revoke or rotate keys from the portal."}},"schemas":{"GetQuoteDetailsResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/QuoteDetails"}},"required":["success","data"]},"QuoteDetails":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the quote"},"quoteNumber":{"type":["string","null"],"description":"Human-readable quote number"},"projectName":{"type":["string","null"],"description":"Project name from the original RFQ"},"projectDescription":{"type":["string","null"],"description":"Project description from the original RFQ"},"status":{"type":"string","enum":["PENDING","SENT","SENT_PENDING","REVISED","SENT_REVISED","ACCEPTED","REJECTED","EXPIRED","CANCELLED","CHANGED_TO_PROJECT"],"description":"Quote lifecycle status. Admin/internal API keys receive the same statuses as the main app. Client API keys receive client-facing statuses where `SENT` and `SENT_PENDING` are shown as `PENDING`, and `SENT_REVISED` is shown as `REVISED`.\n\n| Status | Description |\n|--------|-------------|\n| `PENDING` | Quote being prepared |\n| `SENT` | Quote sent to client |\n| `SENT_PENDING` | Quote sent and pending client action (admin/internal view) |\n| `REVISED` | Quote revised after feedback |\n| `SENT_REVISED` | Revised quote sent and pending client action (admin/internal view) |\n| `ACCEPTED` | Quote accepted by client |\n| `REJECTED` | Quote declined by client |\n| `EXPIRED` | Quote expired |\n| `CANCELLED` | Quote cancelled |\n| `CHANGED_TO_PROJECT` | Quote converted to project |\n"},"company":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"name":{"type":"string","description":"Company name"},"country":{"type":["string","null"],"description":"Country code (ISO 3166-1 alpha-2)"},"timezone":{"type":["string","null"],"description":"Company timezone"},"clientUsers":{"type":"array","items":{"$ref":"#/components/schemas/QuoteClientUser"},"description":"Client users associated with this quote"},"logo":{"type":["object","null"],"properties":{"url":{"type":"string"}},"required":["url"],"description":"Company logo"},"team":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"name":{"type":"string"},"shortName":{"type":"string"}},"required":["id","name","shortName"],"description":"Assigned team"}},"required":["id","name","country","timezone","clientUsers"],"description":"Company information"},"totalPrice":{"type":["object","null"],"properties":{"amount":{"type":"number","description":"Total price amount"},"currency":{"type":"string","description":"Currency code (ISO 4217)"}},"required":["amount","currency"],"description":"Total quote price"},"quoteDate":{"type":["string","null"],"format":"date-time","description":"Date when quote was created/sent"},"deadlineForQuote":{"type":["string","null"],"format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Deadline for quote response"},"projectDueDate":{"type":["string","null"],"format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Project delivery deadline"},"validUntil":{"type":["string","null"],"format":"date-time","description":"Quote validity expiration date"},"referenceNumber":{"type":["string","null"],"description":"Client or internal reference number"},"poNumber":{"type":["string","null"],"description":"Purchase order number if provided"},"poRequired":{"type":["boolean","null"],"description":"Whether a PO is required for this quote"},"generalInformation":{"type":["object","null"],"properties":{"projectName":{"type":["string","null"]},"projectDescription":{"type":["string","null"]},"backgroundInfo":{"type":["string","null"]},"targetAudience":{"type":["string","null"]},"referenceNumber":{"type":["string","null"]}},"required":["projectName","projectDescription","backgroundInfo","targetAudience","referenceNumber"],"description":"General project information"},"timeline":{"type":["object","null"],"properties":{"quoteExpiryDate":{"type":["string","null"],"format":"date-time","description":"Date and time in ISO 8601 format"},"projectDueDate":{"type":["string","null"],"format":"date-time","description":"Date and time in ISO 8601 format"}},"required":["quoteExpiryDate","projectDueDate"],"description":"Quote and project timeline"},"rfqInformation":{"type":["object","null"],"properties":{"rfqId":{"type":["string","null"]},"rfqNo":{"type":["string","null"]},"deadlineForQuote":{"type":["string","null"],"format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Date in ISO 8601 format (YYYY-MM-DD)"}},"required":["rfqId","rfqNo","deadlineForQuote"],"description":"Source RFQ information"},"projectTeam":{"type":["object","null"],"properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/QuoteTeamMember"}},"projectOwner":{"type":["object","null"],"properties":{"name":{"type":"string"},"email":{"type":"string"},"userId":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"profilePicture":{"type":["object","null"],"properties":{"url":{"type":"string"}},"required":["url"]}},"required":["name","email","userId"]}},"required":["members"],"description":"Project team members"},"itemsPricing":{"type":["object","null"],"properties":{"teams":{"type":"array","items":{"$ref":"#/components/schemas/QuotePricingTeam"}},"total":{"type":"number"},"calculatedAt":{"type":["string","null"],"format":"date-time","description":"Date and time in ISO 8601 format"}},"required":["teams","total","calculatedAt"],"description":"Detailed pricing breakdown by team and service"},"createdAt":{"type":"string","format":"date-time","description":"Date and time in ISO 8601 format"},"updatedAt":{"type":["string","null"],"format":"date-time","description":"Date and time in ISO 8601 format"}},"required":["id","quoteNumber","projectName","projectDescription","status","company","totalPrice","quoteDate","deadlineForQuote","projectDueDate","validUntil"]},"QuoteClientUser":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string"},"profilePicture":{"type":["object","null"],"properties":{"url":{"type":"string"}},"required":["url"]}},"required":["id","name","email","role"]},"QuoteTeamMember":{"type":"object","properties":{"userId":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string"},"isProjectOwner":{"type":"boolean"},"profilePicture":{"type":["object","null"],"properties":{"url":{"type":"string"}},"required":["url"]}},"required":["userId","name","email","role","isProjectOwner"]},"QuotePricingTeam":{"type":"object","properties":{"teamName":{"type":"string"},"currency":{"type":"string"},"total":{"type":"number"},"clientServices":{"type":"array","items":{"$ref":"#/components/schemas/QuotePricingService"}}},"required":["teamName","currency","total","clientServices"]},"QuotePricingService":{"type":"object","properties":{"serviceName":{"type":"string"},"serviceType":{"type":"string"},"dueDate":{"type":["string","null"],"format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Date in ISO 8601 format (YYYY-MM-DD)"},"notes":{"type":["string","null"]},"total":{"type":"number"},"targetMarkets":{"type":"array","items":{"$ref":"#/components/schemas/QuotePricingTargetMarket"}}},"required":["serviceName","serviceType","dueDate","notes","total","targetMarkets"]},"QuotePricingTargetMarket":{"type":"object","properties":{"targetMarketId":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"targetMarketLabel":{"type":"string"},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuotePricingLineItem"}},"subTotal":{"type":"number"}},"required":["targetMarketId","targetMarketLabel","items","subTotal"]},"QuotePricingLineItem":{"type":"object","properties":{"itemName":{"type":"string"},"unit":{"type":"string"},"quantity":{"type":"number"},"unitPrice":{"type":"number"},"totalPrice":{"type":"number"}},"required":["itemName","unit","quantity","unitPrice","totalPrice"]}}},"paths":{"/api/public/v1/quotes/{id}":{"get":{"summary":"🔍 Get Quote Details","description":"## Get Full Quote Details\n\nRetrieve complete information about a specific quote, including:\n- Quote number and project information\n- Pricing details\n- Status and dates\n- Company information","tags":["💰 Quotes"],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Quote ID"},"required":true,"description":"Quote ID","name":"id","in":"path"}],"responses":{"200":{"description":"Quote details retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetQuoteDetailsResponse"}}}},"401":{"description":"Authentication required"},"403":{"description":"Access denied"},"404":{"description":"Quote not found"}}}}}}
````

## ✅ Accept Quote

> \## Accept a Quote\
> \
> Accept a quote to convert it into an active project. Once accepted, the quote status changes to \`CHANGED\_TO\_PROJECT\` and a new project is created.\
> \
> \### When to Use This\
> \
> Use this endpoint when you're ready to proceed with the work described in the quote. The quote must be in \`SENT\` or \`REVISED\` status.\
> \
> \### What Happens\
> \
> \- Quote status changes to \`CHANGED\_TO\_PROJECT\`\
> \- A new project is created based on the quote\
> \- You'll receive notifications about the project creation

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"💰 Quotes","description":"## Quote Management\n\nQuotes are provided by Locaria in response to your RFQs. Once an RFQ is submitted, Locaria reviews it and creates a quote with pricing and delivery details.\n\n### Quote Lifecycle\n\n```\nPENDING ──▶ SENT ──▶ ACCEPTED ──▶ CHANGED_TO_PROJECT\n  │           │\n  │           └──▶ REVISED ──▶ SENT\n  │\n  └──▶ REJECTED\n  └──▶ EXPIRED\n  └──▶ CANCELLED\n```\n\n### Status Descriptions\n\n| Status | Description | Actions Available |\n|--------|-------------|-------------------|\n| PENDING | Quote being prepared | ⏳ Wait |\n| SENT | Quote sent to client | ✅ Accept, ❌ Decline |\n| REVISED | Quote revised after feedback | ✅ Accept, ❌ Decline |\n| ACCEPTED | Quote accepted by client | ✅ Converted to project |\n| REJECTED | Quote declined by client | ❌ No further actions |\n| EXPIRED | Quote expired | ❌ No further actions |\n| CANCELLED | Quote cancelled | ❌ No further actions |\n| CHANGED_TO_PROJECT | Quote converted to project | ✅ Project started |\n\n### Quote Actions\n\n- **Accept**: Accept a quote to convert it into an active project\n- **Decline**: Reject a quote (optional reason can be provided)\n- **Download PDF**: Get a PDF version of the quote for your records\n"}],"servers":[{"url":"https://api.adaptria.locaria.com","description":"Production Environment"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Api-key","description":"## API Key Authentication\n\nStatic API key obtained from the Adaptria Portal or via `POST /api/credentials/api-keys`.\n\n**How to authenticate**:\n1. Generate an API key from the Adaptria Portal (Settings → API Keys) or ask your admin\n2. Include the key in all requests using the `Api-key` header\n\n**Key format**: `lla_live_<32-character-string>`\n\n**No token exchange needed** — the key is used directly in every request. Revoke or rotate keys from the portal."}},"schemas":{"AcceptQuoteResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"status":{"type":"string","description":"New quote status (typically CHANGED_TO_PROJECT)"},"message":{"type":"string","description":"Success message"}},"required":["id","status","message"],"description":"Accept quote response data"}},"required":["success","data"]}}},"paths":{"/api/public/v1/quotes/{id}/accept":{"post":{"summary":"✅ Accept Quote","description":"## Accept a Quote\n\nAccept a quote to convert it into an active project. Once accepted, the quote status changes to `CHANGED_TO_PROJECT` and a new project is created.\n\n### When to Use This\n\nUse this endpoint when you're ready to proceed with the work described in the quote. The quote must be in `SENT` or `REVISED` status.\n\n### What Happens\n\n- Quote status changes to `CHANGED_TO_PROJECT`\n- A new project is created based on the quote\n- You'll receive notifications about the project creation","tags":["💰 Quotes"],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Quote ID"},"required":true,"description":"Quote ID","name":"id","in":"path"}],"responses":{"200":{"description":"Quote accepted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptQuoteResponse"}}}},"400":{"description":"Quote cannot be accepted in current status"},"401":{"description":"Authentication required"},"403":{"description":"Access denied"},"404":{"description":"Quote not found"}}}}}}
````

## ❌ Reject Quote

> \## Reject a Quote\
> \
> Reject a quote that you don't want to proceed with. Optionally provide a reason for rejecting.\
> \
> \### When to Use This\
> \
> Use this endpoint when you decide not to proceed with the quote. The quote status changes to \`REJECTED\`.\
> \
> \### Optional Reason\
> \
> You can provide a reason for rejecting, which helps Locaria understand your decision and improve future quotes.

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"💰 Quotes","description":"## Quote Management\n\nQuotes are provided by Locaria in response to your RFQs. Once an RFQ is submitted, Locaria reviews it and creates a quote with pricing and delivery details.\n\n### Quote Lifecycle\n\n```\nPENDING ──▶ SENT ──▶ ACCEPTED ──▶ CHANGED_TO_PROJECT\n  │           │\n  │           └──▶ REVISED ──▶ SENT\n  │\n  └──▶ REJECTED\n  └──▶ EXPIRED\n  └──▶ CANCELLED\n```\n\n### Status Descriptions\n\n| Status | Description | Actions Available |\n|--------|-------------|-------------------|\n| PENDING | Quote being prepared | ⏳ Wait |\n| SENT | Quote sent to client | ✅ Accept, ❌ Decline |\n| REVISED | Quote revised after feedback | ✅ Accept, ❌ Decline |\n| ACCEPTED | Quote accepted by client | ✅ Converted to project |\n| REJECTED | Quote declined by client | ❌ No further actions |\n| EXPIRED | Quote expired | ❌ No further actions |\n| CANCELLED | Quote cancelled | ❌ No further actions |\n| CHANGED_TO_PROJECT | Quote converted to project | ✅ Project started |\n\n### Quote Actions\n\n- **Accept**: Accept a quote to convert it into an active project\n- **Decline**: Reject a quote (optional reason can be provided)\n- **Download PDF**: Get a PDF version of the quote for your records\n"}],"servers":[{"url":"https://api.adaptria.locaria.com","description":"Production Environment"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Api-key","description":"## API Key Authentication\n\nStatic API key obtained from the Adaptria Portal or via `POST /api/credentials/api-keys`.\n\n**How to authenticate**:\n1. Generate an API key from the Adaptria Portal (Settings → API Keys) or ask your admin\n2. Include the key in all requests using the `Api-key` header\n\n**Key format**: `lla_live_<32-character-string>`\n\n**No token exchange needed** — the key is used directly in every request. Revoke or rotate keys from the portal."}},"schemas":{"DeclineQuoteRequest":{"type":"object","properties":{"reason":{"type":"string","maxLength":1000,"description":"Optional reason for rejecting the quote"}}},"DeclineQuoteResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"status":{"type":"string","description":"New quote status (REJECTED)"},"message":{"type":"string","description":"Success message"}},"required":["id","status","message"],"description":"Reject quote response data"}},"required":["success","data"]}}},"paths":{"/api/public/v1/quotes/{id}/decline":{"post":{"summary":"❌ Reject Quote","description":"## Reject a Quote\n\nReject a quote that you don't want to proceed with. Optionally provide a reason for rejecting.\n\n### When to Use This\n\nUse this endpoint when you decide not to proceed with the quote. The quote status changes to `REJECTED`.\n\n### Optional Reason\n\nYou can provide a reason for rejecting, which helps Locaria understand your decision and improve future quotes.","tags":["💰 Quotes"],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Quote ID"},"required":true,"description":"Quote ID","name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeclineQuoteRequest"}}}},"responses":{"200":{"description":"Quote rejected successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeclineQuoteResponse"}}}},"400":{"description":"Quote cannot be rejected in current status"},"401":{"description":"Authentication required"},"403":{"description":"Access denied"},"404":{"description":"Quote not found"}}}}}}
````

## 📄 Download Quote PDF

> \## Get Quote as PDF\
> \
> Download a PDF version of the quote for your records or to share with stakeholders.\
> \
> \### Response\
> \
> Returns a temporary download URL that expires after 1 hour (3600 seconds). The URL can be used to download the PDF file directly.

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"💰 Quotes","description":"## Quote Management\n\nQuotes are provided by Locaria in response to your RFQs. Once an RFQ is submitted, Locaria reviews it and creates a quote with pricing and delivery details.\n\n### Quote Lifecycle\n\n```\nPENDING ──▶ SENT ──▶ ACCEPTED ──▶ CHANGED_TO_PROJECT\n  │           │\n  │           └──▶ REVISED ──▶ SENT\n  │\n  └──▶ REJECTED\n  └──▶ EXPIRED\n  └──▶ CANCELLED\n```\n\n### Status Descriptions\n\n| Status | Description | Actions Available |\n|--------|-------------|-------------------|\n| PENDING | Quote being prepared | ⏳ Wait |\n| SENT | Quote sent to client | ✅ Accept, ❌ Decline |\n| REVISED | Quote revised after feedback | ✅ Accept, ❌ Decline |\n| ACCEPTED | Quote accepted by client | ✅ Converted to project |\n| REJECTED | Quote declined by client | ❌ No further actions |\n| EXPIRED | Quote expired | ❌ No further actions |\n| CANCELLED | Quote cancelled | ❌ No further actions |\n| CHANGED_TO_PROJECT | Quote converted to project | ✅ Project started |\n\n### Quote Actions\n\n- **Accept**: Accept a quote to convert it into an active project\n- **Decline**: Reject a quote (optional reason can be provided)\n- **Download PDF**: Get a PDF version of the quote for your records\n"}],"servers":[{"url":"https://api.adaptria.locaria.com","description":"Production Environment"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Api-key","description":"## API Key Authentication\n\nStatic API key obtained from the Adaptria Portal or via `POST /api/credentials/api-keys`.\n\n**How to authenticate**:\n1. Generate an API key from the Adaptria Portal (Settings → API Keys) or ask your admin\n2. Include the key in all requests using the `Api-key` header\n\n**Key format**: `lla_live_<32-character-string>`\n\n**No token exchange needed** — the key is used directly in every request. Revoke or rotate keys from the portal."}},"schemas":{"QuotePdfResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"downloadUrl":{"type":"string","format":"uri","description":"Temporary URL to download the quote PDF"},"fileName":{"type":"string","description":"PDF filename"},"expiresIn":{"type":"integer","description":"URL validity in seconds (typically 3600)"}},"required":["downloadUrl","fileName","expiresIn"],"description":"Quote PDF download information"}},"required":["success","data"]}}},"paths":{"/api/public/v1/quotes/{id}/pdf":{"get":{"summary":"📄 Download Quote PDF","description":"## Get Quote as PDF\n\nDownload a PDF version of the quote for your records or to share with stakeholders.\n\n### Response\n\nReturns a temporary download URL that expires after 1 hour (3600 seconds). The URL can be used to download the PDF file directly.","tags":["💰 Quotes"],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Quote ID"},"required":true,"description":"Quote ID","name":"id","in":"path"}],"responses":{"200":{"description":"Quote PDF download URL generated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotePdfResponse"}}}},"401":{"description":"Authentication required"},"403":{"description":"Access denied"},"404":{"description":"Quote not found"}}}}}}
````

## 💰 Get Quote Filters

> Mirrors \`GET /api/core/quotes/filters\`.

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"💰 Quotes","description":"## Quote Management\n\nQuotes are provided by Locaria in response to your RFQs. Once an RFQ is submitted, Locaria reviews it and creates a quote with pricing and delivery details.\n\n### Quote Lifecycle\n\n```\nPENDING ──▶ SENT ──▶ ACCEPTED ──▶ CHANGED_TO_PROJECT\n  │           │\n  │           └──▶ REVISED ──▶ SENT\n  │\n  └──▶ REJECTED\n  └──▶ EXPIRED\n  └──▶ CANCELLED\n```\n\n### Status Descriptions\n\n| Status | Description | Actions Available |\n|--------|-------------|-------------------|\n| PENDING | Quote being prepared | ⏳ Wait |\n| SENT | Quote sent to client | ✅ Accept, ❌ Decline |\n| REVISED | Quote revised after feedback | ✅ Accept, ❌ Decline |\n| ACCEPTED | Quote accepted by client | ✅ Converted to project |\n| REJECTED | Quote declined by client | ❌ No further actions |\n| EXPIRED | Quote expired | ❌ No further actions |\n| CANCELLED | Quote cancelled | ❌ No further actions |\n| CHANGED_TO_PROJECT | Quote converted to project | ✅ Project started |\n\n### Quote Actions\n\n- **Accept**: Accept a quote to convert it into an active project\n- **Decline**: Reject a quote (optional reason can be provided)\n- **Download PDF**: Get a PDF version of the quote for your records\n"}],"servers":[{"url":"https://api.adaptria.locaria.com","description":"Production Environment"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Api-key","description":"## API Key Authentication\n\nStatic API key obtained from the Adaptria Portal or via `POST /api/credentials/api-keys`.\n\n**How to authenticate**:\n1. Generate an API key from the Adaptria Portal (Settings → API Keys) or ask your admin\n2. Include the key in all requests using the `Api-key` header\n\n**Key format**: `lla_live_<32-character-string>`\n\n**No token exchange needed** — the key is used directly in every request. Revoke or rotate keys from the portal."}},"schemas":{"PublicQuoteFiltersResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}}},"required":["success","data"]}}},"paths":{"/api/public/v1/quotes/filters":{"get":{"summary":"💰 Get Quote Filters","description":"Mirrors `GET /api/core/quotes/filters`.","tags":["💰 Quotes"],"responses":{"200":{"description":"Filters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuoteFiltersResponse"}}}},"401":{"description":"Authentication required"},"403":{"description":"Access denied"}}}}}}
````

## GET /api/public/v1/quotes/{id}/project-team-users

> 💰 Get project team users for quote tagging/mentioning

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"💰 Quotes","description":"## Quote Management\n\nQuotes are provided by Locaria in response to your RFQs. Once an RFQ is submitted, Locaria reviews it and creates a quote with pricing and delivery details.\n\n### Quote Lifecycle\n\n```\nPENDING ──▶ SENT ──▶ ACCEPTED ──▶ CHANGED_TO_PROJECT\n  │           │\n  │           └──▶ REVISED ──▶ SENT\n  │\n  └──▶ REJECTED\n  └──▶ EXPIRED\n  └──▶ CANCELLED\n```\n\n### Status Descriptions\n\n| Status | Description | Actions Available |\n|--------|-------------|-------------------|\n| PENDING | Quote being prepared | ⏳ Wait |\n| SENT | Quote sent to client | ✅ Accept, ❌ Decline |\n| REVISED | Quote revised after feedback | ✅ Accept, ❌ Decline |\n| ACCEPTED | Quote accepted by client | ✅ Converted to project |\n| REJECTED | Quote declined by client | ❌ No further actions |\n| EXPIRED | Quote expired | ❌ No further actions |\n| CANCELLED | Quote cancelled | ❌ No further actions |\n| CHANGED_TO_PROJECT | Quote converted to project | ✅ Project started |\n\n### Quote Actions\n\n- **Accept**: Accept a quote to convert it into an active project\n- **Decline**: Reject a quote (optional reason can be provided)\n- **Download PDF**: Get a PDF version of the quote for your records\n"}],"servers":[{"url":"https://api.adaptria.locaria.com","description":"Production Environment"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Api-key","description":"## API Key Authentication\n\nStatic API key obtained from the Adaptria Portal or via `POST /api/credentials/api-keys`.\n\n**How to authenticate**:\n1. Generate an API key from the Adaptria Portal (Settings → API Keys) or ask your admin\n2. Include the key in all requests using the `Api-key` header\n\n**Key format**: `lla_live_<32-character-string>`\n\n**No token exchange needed** — the key is used directly in every request. Revoke or rotate keys from the portal."}},"schemas":{"PublicQuoteTeamUsersResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["success","data"]}}},"paths":{"/api/public/v1/quotes/{id}/project-team-users":{"get":{"summary":"💰 Get project team users for quote tagging/mentioning","tags":["💰 Quotes"],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Team users","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuoteTeamUsersResponse"}}}},"401":{"description":"Authentication required"},"403":{"description":"Access denied"},"404":{"description":"Quote not found"}}}}}}
````

## GET /api/public/v1/quotes/{id}/summary

> 💰 Get enhanced quote summary with detailed team breakdown

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"💰 Quotes","description":"## Quote Management\n\nQuotes are provided by Locaria in response to your RFQs. Once an RFQ is submitted, Locaria reviews it and creates a quote with pricing and delivery details.\n\n### Quote Lifecycle\n\n```\nPENDING ──▶ SENT ──▶ ACCEPTED ──▶ CHANGED_TO_PROJECT\n  │           │\n  │           └──▶ REVISED ──▶ SENT\n  │\n  └──▶ REJECTED\n  └──▶ EXPIRED\n  └──▶ CANCELLED\n```\n\n### Status Descriptions\n\n| Status | Description | Actions Available |\n|--------|-------------|-------------------|\n| PENDING | Quote being prepared | ⏳ Wait |\n| SENT | Quote sent to client | ✅ Accept, ❌ Decline |\n| REVISED | Quote revised after feedback | ✅ Accept, ❌ Decline |\n| ACCEPTED | Quote accepted by client | ✅ Converted to project |\n| REJECTED | Quote declined by client | ❌ No further actions |\n| EXPIRED | Quote expired | ❌ No further actions |\n| CANCELLED | Quote cancelled | ❌ No further actions |\n| CHANGED_TO_PROJECT | Quote converted to project | ✅ Project started |\n\n### Quote Actions\n\n- **Accept**: Accept a quote to convert it into an active project\n- **Decline**: Reject a quote (optional reason can be provided)\n- **Download PDF**: Get a PDF version of the quote for your records\n"}],"servers":[{"url":"https://api.adaptria.locaria.com","description":"Production Environment"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Api-key","description":"## API Key Authentication\n\nStatic API key obtained from the Adaptria Portal or via `POST /api/credentials/api-keys`.\n\n**How to authenticate**:\n1. Generate an API key from the Adaptria Portal (Settings → API Keys) or ask your admin\n2. Include the key in all requests using the `Api-key` header\n\n**Key format**: `lla_live_<32-character-string>`\n\n**No token exchange needed** — the key is used directly in every request. Revoke or rotate keys from the portal."}},"schemas":{"PublicQuoteSummaryResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}}},"required":["success","data"]}}},"paths":{"/api/public/v1/quotes/{id}/summary":{"get":{"summary":"💰 Get enhanced quote summary with detailed team breakdown","tags":["💰 Quotes"],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Quote summary","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuoteSummaryResponse"}}}},"401":{"description":"Authentication required"},"403":{"description":"Access denied"},"404":{"description":"Quote not found"}}}}}}
````
