> 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/rfqs.md).

# 📄 RFQs

### Request for Quote (RFQ) Management

RFQs are the starting point for all translation and localization projects.

#### RFQ Lifecycle

```
PENDING ──▶ CHANGED_TO_QUOTE ──▶ CHANGED_TO_PROJECT
              │
              └──▶ Project begins!
```

#### Status Descriptions

| Status               | Description               | Can Edit? |
| -------------------- | ------------------------- | --------- |
| PENDING              | Submitted, awaiting quote | ❌ No      |
| CHANGED\_TO\_QUOTE   | Quote provided            | ❌ No      |
| CHANGED\_TO\_PROJECT | Accepted, project started | ❌ No      |

## 📋 List RFQs

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

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"📄 RFQs","description":"## Request for Quote (RFQ) Management\n\nRFQs are the starting point for all translation and localization projects.\n\n### RFQ Lifecycle\n\n```\nPENDING ──▶ CHANGED_TO_QUOTE ──▶ CHANGED_TO_PROJECT\n              │\n              └──▶ Project begins!\n```\n\n### Status Descriptions\n\n| Status | Description | Can Edit? |\n|--------|-------------|-----------|\n| PENDING | Submitted, awaiting quote | ❌ No |\n| CHANGED_TO_QUOTE | Quote provided | ❌ No |\n| CHANGED_TO_PROJECT | Accepted, project started | ❌ No |\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":{"ListRFQsResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/RFQListItem"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["success","data","pagination"]},"RFQListItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"rfqNumber":{"type":["string","null"],"description":"Human-readable RFQ number (null for drafts)"},"projectName":{"type":"string"},"status":{"type":"string","enum":["PENDING","CHANGED_TO_QUOTE","CHANGED_TO_PROJECT"],"description":"RFQ lifecycle status:\n\n| Status | Description |\n|--------|-------------|\n| `PENDING` | Submitted - waiting for Adaptria to review and provide a quote |\n| `CHANGED_TO_QUOTE` | Adaptria has provided a quote based on this RFQ |\n| `CHANGED_TO_PROJECT` | Quote was accepted and converted to an active project |"},"companyId":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"companyName":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"submittedAt":{"type":"string","format":"date-time"}},"required":["id","rfqNumber","projectName","status","companyId","companyName","createdAt","updatedAt"]},"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/rfqs":{"get":{"summary":"📋 List RFQs","description":"## List Your RFQs\n\nRetrieve a paginated list of RFQs accessible to your API credentials.\n\n### Filtering Options\n\n| Parameter | Description |\n|-----------|-------------|\n| `status` | Filter by status (DRAFT, PENDING, etc.) |\n| `search` | Search by project name or RFQ 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 RFQ - use `GET /api/public/v1/rfqs/:id` for full details.","tags":["📄 RFQs"],"parameters":[{"schema":{"type":"string","pattern":"^\\d+$","default":"1","description":"Page number to retrieve (starts from 1)"},"required":false,"description":"Page number to retrieve (starts from 1)","name":"page","in":"query"},{"schema":{"type":"string","pattern":"^\\d+$","default":"20","description":"Number of items per page (max 100)"},"required":false,"description":"Number of items per page (max 100)","name":"limit","in":"query"},{"schema":{"type":"string","description":"Filter by RFQ status.\n\nAvailable values: `PENDING`, `CHANGED_TO_QUOTE`, `CHANGED_TO_PROJECT`"},"required":false,"description":"Filter by RFQ status.\n\nAvailable values: `PENDING`, `CHANGED_TO_QUOTE`, `CHANGED_TO_PROJECT`","name":"status","in":"query"},{"schema":{"type":"string","description":"Search by project name or RFQ number"},"required":false,"description":"Search by project name or RFQ number","name":"search","in":"query"}],"responses":{"200":{"description":"RFQs retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListRFQsResponse"}}}},"401":{"description":"Authentication required"}}}}}}
````

## 📝 Create and Submit RFQ

> \## Create and Submit a Request for Quote (RFQ) - Unified API\
> \
> This \*\*unified endpoint\*\* creates an RFQ with services and automatically submits it in a \*\*single API call\*\*.\
> \
> \### What You Can Do in ONE Request\
> \
> \- ✅ Create the RFQ with project details\
> \- ✅ Add \*\*LINGUISTICS\*\* services (translation) with source/target languages\
> \- ✅ Add \*\*NON\_LINGUISTICS\*\* services (video adaptation) with target markets\
> \- ✅ Attach pre-uploaded files to services\
> \- ✅ Add notification recipients\
> \- ✅ Automatically submit for quoting\
> \
> \### Service Types\
> \
> \*\*LINGUISTICS\*\* (for translation/localization):\
> \`\`\`json\
> {\
> &#x20; "serviceId": "34acfed6-ae10-46e3-8896-9afe78c2ecdc",\
> &#x20; "type": "LINGUISTICS",\
> &#x20; "sourceLanguageId": "f5e4d3c2-b1a0-4321-8765-fedcba987654",\
> &#x20; "targetLanguageIds": \["a1b2c3d4-e5f6-7890-abcd-ef1234567890", "b2c3d4e5-f6a7-8901-bcde-f12345678901"],\
> &#x20; "assetFileIds": \["67eb9e88-7962-41a1-9695-f2051a968728"]\
> }\
> \`\`\`\
> \
> \*\*NON\_LINGUISTICS\*\* (for video adaptation, creative services like 3D animation):\
> \`\`\`json\
> {\
> &#x20; "serviceId": "0cf41489-6424-492a-8cd7-4f7eef02858e",\
> &#x20; "type": "NON\_LINGUISTICS",\
> &#x20; "targetMarketIds": \["03b91040-5931-4c24-9310-7a33861edde2", "0f64c0dc-3e00-4b4f-86cc-9259a2b575d6"],\
> &#x20; "assetFileIds": \["67eb9e88-7962-41a1-9695-f2051a968728"]\
> }\
> \`\`\`\
> \
> \*\*Note\*\*: \`assetFileIds\` contains file IDs obtained from the \[File Upload]\(#tag/%F0%9F%93%A4%20File%20Upload) endpoint. Upload files first, then use the returned \`fileId\` values here.\
> \
> \### Internal Transformation\
> \
> Your simplified input is automatically transformed to the internal format:\
> \
> \| Public API Field | Internal Field |\
> \|------------------|----------------|\
> \| \`serviceId\` | \`serviceUUID\` |\
> \| \`targetMarketIds\[]\` | \`targetMarkets\[].targetMarketId\` |\
> \| \`sourceLanguageId\` | \`combos\[].sourceLanguage\` |\
> \| \`targetLanguageIds\[]\` | \`combos\[].targetLanguages\[].languageId\` |\
> \
> \### Recommended Workflow\
> \
> \`\`\`\
> 1\. GET /api/public/v1/client/companies      → Get company ID (see \[Companies]\(#tag/%F0%9F%8F%A2%20Companies) section)\
> 2\. GET /api/public/v1/client/services       → Get available client services (see \[Client Services]\(#tag/%F0%9F%A7%A9%20Client%20Services) section)\
> 3\. GET /api/public/v1/client/languages      → Get language IDs (see \[Languages]\(#tag/%F0%9F%8C%8D%20Languages) section)\
> 4\. GET /api/public/v1/client/target-markets → Get target market IDs (see \[Target Markets]\(#tag/%F0%9F%8E%AF%20Target%20Markets) section)\
> 5\. (Optional) POST /api/files/upload/presigned-url → Upload files and get file IDs (see \[File Upload]\(#tag/%F0%9F%93%A4%20File%20Upload) section)\
> 6\. POST /api/public/v1/rfqs                 → Create & submit RFQ (this endpoint)\
> 7\. GET /api/public/v1/rfqs/:id              → Check status\
> \`\`\`\
> \
> \### Auto Submit Control\
> \
> By default (\`autoSubmit: true\`), the RFQ is submitted immediately with PENDING status.\
> \
> \### PO Number Uniqueness\
> \
> The \`poNumber\` field must be unique per company. Duplicate PO numbers return \*\*409 Conflict\*\*.

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"📄 RFQs","description":"## Request for Quote (RFQ) Management\n\nRFQs are the starting point for all translation and localization projects.\n\n### RFQ Lifecycle\n\n```\nPENDING ──▶ CHANGED_TO_QUOTE ──▶ CHANGED_TO_PROJECT\n              │\n              └──▶ Project begins!\n```\n\n### Status Descriptions\n\n| Status | Description | Can Edit? |\n|--------|-------------|-----------|\n| PENDING | Submitted, awaiting quote | ❌ No |\n| CHANGED_TO_QUOTE | Quote provided | ❌ No |\n| CHANGED_TO_PROJECT | Accepted, project started | ❌ No |\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":{"CreateRFQRequest":{"type":"object","properties":{"companyId":{"type":"string","format":"uuid","description":"The company ID this RFQ belongs to.\n\n**Important**: You must have access to this company through your API credentials.\n\n📖 **To get company IDs**: See the [Companies](#tag/%F0%9F%8F%A2%20Companies) section → `GET /api/public/v1/client/companies`"},"projectName":{"type":"string","minLength":1,"maxLength":255,"description":"A clear, descriptive name for your project.\n\n**Best Practices**:\n- Be specific: \"Q4 Marketing Campaign - German Website\" vs \"Translation Project\"\n- Include key identifiers: campaign name, product, date"},"projectDescription":{"type":"string","minLength":1,"maxLength":2000,"description":"Detailed description of what needs to be translated/localized.\n\n**Include**: Content type, volume estimate, specific requirements, file formats"},"backgroundInfo":{"type":"string","maxLength":1000,"description":"Additional context about your company, brand, or project"},"targetAudience":{"type":"string","maxLength":500,"description":"Who will consume the translated content? Helps with tone and terminology choices."},"poNumber":{"type":"string","maxLength":100,"description":"Your internal Purchase Order number (must be unique per company)"},"referenceNumber":{"type":"string","maxLength":100,"description":"Your internal reference or ticket number"},"projectDueDate":{"type":["string","null"],"format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"When do you need the final deliverables? (YYYY-MM-DD, can be null)"},"deadlineForQuote":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"By when do you need the quote? (YYYY-MM-DD)"},"services":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/LinguisticsService"},{"$ref":"#/components/schemas/NonLinguisticsService"}],"discriminator":{"propertyName":"type","mapping":{"LINGUISTICS":"#/components/schemas/LinguisticsService","NON_LINGUISTICS":"#/components/schemas/NonLinguisticsService"}}},"description":"**Services to include in this RFQ**\n\nEach service requires different fields based on its type:\n\n**LINGUISTICS** (translation/localization):\n- `serviceId`: Service ID - see [Client Services](#tag/%F0%9F%A7%A9%20Client%20Services) section\n- `type`: \"LINGUISTICS\"\n- `sourceLanguageId`: Source language ID - see [Languages](#tag/%F0%9F%8C%8D%20Languages) section\n- `targetLanguageIds`: Array of target language IDs - see [Languages](#tag/%F0%9F%8C%8D%20Languages) section\n- `assetFileIds`: (optional) Pre-uploaded file IDs - see [File Upload](#tag/%F0%9F%93%A4%20File%20Upload) section\n\n**NON_LINGUISTICS** (video adaptation, creative):\n- `serviceId`: Service ID - see [Client Services](#tag/%F0%9F%A7%A9%20Client%20Services) section\n- `type`: \"NON_LINGUISTICS\"\n- `targetMarketIds`: Array of target market IDs - see [Target Markets](#tag/%F0%9F%8E%AF%20Target%20Markets) section\n- `assetFileIds`: (optional) Pre-uploaded file IDs - see [File Upload](#tag/%F0%9F%93%A4%20File%20Upload) section"},"autoSubmit":{"type":"boolean","default":true,"description":"If true (default), the RFQ is automatically submitted with PENDING status."}},"required":["companyId","projectName","projectDescription"]},"LinguisticsService":{"type":"object","properties":{"serviceId":{"type":"string","format":"uuid","description":"Service ID (serviceUUID) from GET /api/public/v1/client/services. Must be a service with type \"LINGUISTICS\".\n\n📖 **To get service IDs**: See the [Client Services](#tag/%F0%9F%A7%A9%20Client%20Services) section → `GET /api/public/v1/client/services`"},"type":{"type":"string","enum":["LINGUISTICS"],"description":"Service type - use LINGUISTICS for translation/localization"},"sourceLanguageId":{"type":"string","format":"uuid","description":"Source language ID from GET /api/public/v1/client/languages. Maps to combos[].sourceLanguage internally.\n\n📖 **To get language IDs**: See the [Languages](#tag/%F0%9F%8C%8D%20Languages) section → `GET /api/public/v1/client/languages`"},"targetLanguageIds":{"type":"array","items":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"minItems":1,"description":"Array of target language IDs from GET /api/public/v1/client/languages. Each maps to combos[].targetLanguages[].languageId.\n\n📖 **To get language IDs**: See the [Languages](#tag/%F0%9F%8C%8D%20Languages) section → `GET /api/public/v1/client/languages`"},"assetFileIds":{"type":"array","items":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"description":"Optional array of pre-uploaded file IDs to attach to this service.\n\n📤 **To get file IDs**:\n1. Upload files using `POST /api/public/v1/files/upload/presigned-url` (see [File Upload](#tag/%F0%9F%93%A4%20File%20Upload) section)\n2. Get the `fileId` from the response\n3. Include it in this array\n\n**Important**: Files are uploaded per service. Each service can have its own set of files.\n\n**Example**: `[\"67eb9e88-7962-41a1-9695-f2051a968728\", \"another-file-id\"]`\n\nThe system automatically transforms these file IDs into the internal assets format (`assets` array with `type: \"FILE\"`, `assetType: \"SOURCE\"`)."}},"required":["serviceId","type","sourceLanguageId","targetLanguageIds"]},"NonLinguisticsService":{"type":"object","properties":{"serviceId":{"type":"string","format":"uuid","description":"Service ID (serviceUUID) from GET /api/public/v1/client/services. Must be a service with type \"NON_LINGUISTICS\".\n\n📖 **To get service IDs**: See the [Client Services](#tag/%F0%9F%A7%A9%20Client%20Services) section → `GET /api/public/v1/client/services`"},"type":{"type":"string","enum":["NON_LINGUISTICS"],"description":"Service type - use NON_LINGUISTICS for video adaptation, creative services"},"targetMarketIds":{"type":"array","items":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"minItems":1,"description":"Array of target market IDs from GET /api/public/v1/client/target-markets. Each ID maps to targetMarkets[].targetMarketId internally.\n\n📖 **To get target market IDs**: See the [Target Markets](#tag/%F0%9F%8E%AF%20Target%20Markets) section → `GET /api/public/v1/client/target-markets`"},"assetFileIds":{"type":"array","items":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"description":"Optional array of pre-uploaded file IDs to attach to this service.\n\n📤 **To get file IDs**:\n1. Upload files using `POST /api/public/v1/files/upload/presigned-url` (see [File Upload](#tag/%F0%9F%93%A4%20File%20Upload) section)\n2. Get the `fileId` from the response\n3. Include it in this array\n\n**Important**: Files are uploaded per service. Each service can have its own set of files.\n\n**Example**: `[\"67eb9e88-7962-41a1-9695-f2051a968728\", \"another-file-id\"]`\n\nThe system automatically transforms these file IDs into the internal assets format (`assets` array with `type: \"FILE\"`, `assetType: \"SOURCE\"`)."}},"required":["serviceId","type","targetMarketIds"]},"CreateRFQResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the created RFQ - use this for all subsequent operations"},"rfqNumber":{"type":["string","null"],"description":"Human-readable RFQ number (assigned after submission, null for drafts)"},"projectName":{"type":"string"},"status":{"type":"string","enum":["PENDING","CHANGED_TO_QUOTE","CHANGED_TO_PROJECT"],"description":"RFQ status - starts at PENDING when submitted"},"company":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"name":{"type":"string","description":"Company name"}},"required":["id","name"]},"servicesAdded":{"type":"number","description":"Number of services configured in the RFQ"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","rfqNumber","projectName","status","company","servicesAdded","createdAt","updatedAt"]},"message":{"type":"string"}},"required":["success","data"]}}},"paths":{"/api/public/v1/rfqs":{"post":{"summary":"📝 Create and Submit RFQ","description":"## Create and Submit a Request for Quote (RFQ) - Unified API\n\nThis **unified endpoint** creates an RFQ with services and automatically submits it in a **single API call**.\n\n### What You Can Do in ONE Request\n\n- ✅ Create the RFQ with project details\n- ✅ Add **LINGUISTICS** services (translation) with source/target languages\n- ✅ Add **NON_LINGUISTICS** services (video adaptation) with target markets\n- ✅ Attach pre-uploaded files to services\n- ✅ Add notification recipients\n- ✅ Automatically submit for quoting\n\n### Service Types\n\n**LINGUISTICS** (for translation/localization):\n```json\n{\n  \"serviceId\": \"34acfed6-ae10-46e3-8896-9afe78c2ecdc\",\n  \"type\": \"LINGUISTICS\",\n  \"sourceLanguageId\": \"f5e4d3c2-b1a0-4321-8765-fedcba987654\",\n  \"targetLanguageIds\": [\"a1b2c3d4-e5f6-7890-abcd-ef1234567890\", \"b2c3d4e5-f6a7-8901-bcde-f12345678901\"],\n  \"assetFileIds\": [\"67eb9e88-7962-41a1-9695-f2051a968728\"]\n}\n```\n\n**NON_LINGUISTICS** (for video adaptation, creative services like 3D animation):\n```json\n{\n  \"serviceId\": \"0cf41489-6424-492a-8cd7-4f7eef02858e\",\n  \"type\": \"NON_LINGUISTICS\",\n  \"targetMarketIds\": [\"03b91040-5931-4c24-9310-7a33861edde2\", \"0f64c0dc-3e00-4b4f-86cc-9259a2b575d6\"],\n  \"assetFileIds\": [\"67eb9e88-7962-41a1-9695-f2051a968728\"]\n}\n```\n\n**Note**: `assetFileIds` contains file IDs obtained from the [File Upload](#tag/%F0%9F%93%A4%20File%20Upload) endpoint. Upload files first, then use the returned `fileId` values here.\n\n### Internal Transformation\n\nYour simplified input is automatically transformed to the internal format:\n\n| Public API Field | Internal Field |\n|------------------|----------------|\n| `serviceId` | `serviceUUID` |\n| `targetMarketIds[]` | `targetMarkets[].targetMarketId` |\n| `sourceLanguageId` | `combos[].sourceLanguage` |\n| `targetLanguageIds[]` | `combos[].targetLanguages[].languageId` |\n\n### Recommended Workflow\n\n```\n1. GET /api/public/v1/client/companies      → Get company ID (see [Companies](#tag/%F0%9F%8F%A2%20Companies) section)\n2. GET /api/public/v1/client/services       → Get available client services (see [Client Services](#tag/%F0%9F%A7%A9%20Client%20Services) section)\n3. GET /api/public/v1/client/languages      → Get language IDs (see [Languages](#tag/%F0%9F%8C%8D%20Languages) section)\n4. GET /api/public/v1/client/target-markets → Get target market IDs (see [Target Markets](#tag/%F0%9F%8E%AF%20Target%20Markets) section)\n5. (Optional) POST /api/files/upload/presigned-url → Upload files and get file IDs (see [File Upload](#tag/%F0%9F%93%A4%20File%20Upload) section)\n6. POST /api/public/v1/rfqs                 → Create & submit RFQ (this endpoint)\n7. GET /api/public/v1/rfqs/:id              → Check status\n```\n\n### Auto Submit Control\n\nBy default (`autoSubmit: true`), the RFQ is submitted immediately with PENDING status.\n\n### PO Number Uniqueness\n\nThe `poNumber` field must be unique per company. Duplicate PO numbers return **409 Conflict**.","tags":["📄 RFQs"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRFQRequest"}}}},"responses":{"201":{"description":"RFQ created and submitted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRFQResponse"}}}},"400":{"description":"Validation error - check required fields and service configuration"},"401":{"description":"Authentication required"},"403":{"description":"Access denied to the specified company"},"409":{"description":"Duplicate PO number - PO numbers must be unique per company"}}}}}}
````

## 🔍 Get RFQ Details

> \## Get Full RFQ Details\
> \
> Retrieve complete information about a specific RFQ, including:\
> \- General information (name, description, dates)\
> \- Selected services\
> \- Language configuration\
> \- Target markets

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"📄 RFQs","description":"## Request for Quote (RFQ) Management\n\nRFQs are the starting point for all translation and localization projects.\n\n### RFQ Lifecycle\n\n```\nPENDING ──▶ CHANGED_TO_QUOTE ──▶ CHANGED_TO_PROJECT\n              │\n              └──▶ Project begins!\n```\n\n### Status Descriptions\n\n| Status | Description | Can Edit? |\n|--------|-------------|-----------|\n| PENDING | Submitted, awaiting quote | ❌ No |\n| CHANGED_TO_QUOTE | Quote provided | ❌ No |\n| CHANGED_TO_PROJECT | Accepted, project started | ❌ No |\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":{"GetRFQDetailsResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/RFQDetails"}},"required":["success","data"]},"RFQDetails":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"rfqNumber":{"type":["string","null"]},"projectName":{"type":"string"},"status":{"type":"string","enum":["PENDING","CHANGED_TO_QUOTE","CHANGED_TO_PROJECT"],"description":"RFQ lifecycle status:\n\n| Status | Description |\n|--------|-------------|\n| `PENDING` | Submitted - waiting for Adaptria to review and provide a quote |\n| `CHANGED_TO_QUOTE` | Adaptria has provided a quote based on this RFQ |\n| `CHANGED_TO_PROJECT` | Quote was accepted and converted to an active project |"},"company":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"name":{"type":"string"}},"required":["id","name"]},"generalInformation":{"type":"object","properties":{"projectName":{"type":"string"},"projectDescription":{"type":"string"},"backgroundInfo":{"type":"string"},"targetAudience":{"type":"string"},"poNumber":{"type":"string"},"referenceNumber":{"type":"string"}},"required":["projectName"]},"projectDueDate":{"type":["string","null"]},"deadlineForQuote":{"type":"string"},"services":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the service"},"name":{"type":"string","description":"Human-readable service name"}},"required":["id","name"]}},"languages":{"type":"object","properties":{"sourceLanguages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"**Language ID - Use this in RFQ creation!** Unique identifier for the language."},"name":{"type":"string","description":"English name of the language"}},"required":["id","name"]}},"targetLanguages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"**Language ID - Use this in RFQ creation!** Unique identifier for the language."},"name":{"type":"string","description":"English name of the language"}},"required":["id","name"]}}},"required":["sourceLanguages","targetLanguages"]},"targetMarkets":{"type":"array","items":{"$ref":"#/components/schemas/PublicTargetMarket"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"submittedAt":{"type":"string","format":"date-time"}},"required":["id","rfqNumber","projectName","status","company","generalInformation","services","languages","targetMarkets","createdAt","updatedAt"]},"PublicTargetMarket":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the target market"},"name":{"type":"string","description":"Human-readable name of the target market/region"},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code"}},"required":["id","name","countryCode"]}}},"paths":{"/api/public/v1/rfqs/{id}":{"get":{"summary":"🔍 Get RFQ Details","description":"## Get Full RFQ Details\n\nRetrieve complete information about a specific RFQ, including:\n- General information (name, description, dates)\n- Selected services\n- Language configuration\n- Target markets","tags":["📄 RFQs"],"parameters":[{"schema":{"type":"string","format":"uuid","description":"RFQ ID"},"required":true,"description":"RFQ ID","name":"id","in":"path"}],"responses":{"200":{"description":"RFQ details retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetRFQDetailsResponse"}}}},"401":{"description":"Authentication required"},"403":{"description":"Access denied"},"404":{"description":"RFQ not found"}}}}}}
````

## 📋 Copy RFQ

> \## Copy an Existing RFQ\
> \
> Create a new draft RFQ by copying the services, languages, target markets, dates, and other editable details from an existing RFQ.\
> \
> The API key owner must have access to the source RFQ. The copied RFQ is returned in the same detailed format as \`GET /api/public/v1/rfqs/{id}\`.

````json
{"openapi":"3.1.0","info":{"title":"Adaptria Public API: Client","version":"1.0.0"},"tags":[{"name":"📄 RFQs","description":"## Request for Quote (RFQ) Management\n\nRFQs are the starting point for all translation and localization projects.\n\n### RFQ Lifecycle\n\n```\nPENDING ──▶ CHANGED_TO_QUOTE ──▶ CHANGED_TO_PROJECT\n              │\n              └──▶ Project begins!\n```\n\n### Status Descriptions\n\n| Status | Description | Can Edit? |\n|--------|-------------|-----------|\n| PENDING | Submitted, awaiting quote | ❌ No |\n| CHANGED_TO_QUOTE | Quote provided | ❌ No |\n| CHANGED_TO_PROJECT | Accepted, project started | ❌ No |\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":{"GetRFQDetailsResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/RFQDetails"}},"required":["success","data"]},"RFQDetails":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"rfqNumber":{"type":["string","null"]},"projectName":{"type":"string"},"status":{"type":"string","enum":["PENDING","CHANGED_TO_QUOTE","CHANGED_TO_PROJECT"],"description":"RFQ lifecycle status:\n\n| Status | Description |\n|--------|-------------|\n| `PENDING` | Submitted - waiting for Adaptria to review and provide a quote |\n| `CHANGED_TO_QUOTE` | Adaptria has provided a quote based on this RFQ |\n| `CHANGED_TO_PROJECT` | Quote was accepted and converted to an active project |"},"company":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Universally Unique Identifier (UUID v4)"},"name":{"type":"string"}},"required":["id","name"]},"generalInformation":{"type":"object","properties":{"projectName":{"type":"string"},"projectDescription":{"type":"string"},"backgroundInfo":{"type":"string"},"targetAudience":{"type":"string"},"poNumber":{"type":"string"},"referenceNumber":{"type":"string"}},"required":["projectName"]},"projectDueDate":{"type":["string","null"]},"deadlineForQuote":{"type":"string"},"services":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the service"},"name":{"type":"string","description":"Human-readable service name"}},"required":["id","name"]}},"languages":{"type":"object","properties":{"sourceLanguages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"**Language ID - Use this in RFQ creation!** Unique identifier for the language."},"name":{"type":"string","description":"English name of the language"}},"required":["id","name"]}},"targetLanguages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"**Language ID - Use this in RFQ creation!** Unique identifier for the language."},"name":{"type":"string","description":"English name of the language"}},"required":["id","name"]}}},"required":["sourceLanguages","targetLanguages"]},"targetMarkets":{"type":"array","items":{"$ref":"#/components/schemas/PublicTargetMarket"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"submittedAt":{"type":"string","format":"date-time"}},"required":["id","rfqNumber","projectName","status","company","generalInformation","services","languages","targetMarkets","createdAt","updatedAt"]},"PublicTargetMarket":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the target market"},"name":{"type":"string","description":"Human-readable name of the target market/region"},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code"}},"required":["id","name","countryCode"]}}},"paths":{"/api/public/v1/rfqs/{id}/copy":{"post":{"summary":"📋 Copy RFQ","description":"## Copy an Existing RFQ\n\nCreate a new draft RFQ by copying the services, languages, target markets, dates, and other editable details from an existing RFQ.\n\nThe API key owner must have access to the source RFQ. The copied RFQ is returned in the same detailed format as `GET /api/public/v1/rfqs/{id}`.","tags":["📄 RFQs"],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Source RFQ ID to copy"},"required":true,"description":"Source RFQ ID to copy","name":"id","in":"path"}],"responses":{"201":{"description":"RFQ copied successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetRFQDetailsResponse"}}}},"401":{"description":"Authentication required"},"403":{"description":"Access denied"},"404":{"description":"Source RFQ not found"}}}}}}
````
