Quotation Management API
The Quotation Management API allows you to manage quotations/estimates in your TaskIP CRM system. You can create, read, update, and delete quotations, convert them to invoices, and manage their approval workflow.
Endpoints Overview
Method | Endpoint | Description |
---|---|---|
GET | /api/public-v1/quotation | Get all quotations |
POST | /api/public-v1/quotation | Create a new quotation |
GET | /api/public-v1/quotation/{id} | Get a specific quotation |
PUT | /api/public-v1/quotation/{id} | Update a quotation |
DELETE | /api/public-v1/quotation/{id} | Delete a quotation |
POST | /api/public-v1/quotation/{id}/convert-to-invoice | Convert quotation to invoice |
POST | /api/public-v1/quotation/{id}/send-to-client | Send quotation to client via email |
POST | /api/public-v1/quotation/{id}/status-update | Update quotation status |
POST | /api/public-v1/quotation/publish/{id} | Publish/unpublish quotation |
GET | /api/public-v1/quotation/{id}/download | Download quotation PDF |
POST | /api/public-v1/quotation/sent/{id} | Send quotation to client (rate limited) |
POST | /api/public-v1/quotation/bulk-actions | Perform bulk operations |
Get All Quotations
Retrieve a list of all quotations in your system.
GET /api/public-v1/quotation
Request Headers
X-Secret-Key: your-secret-key-here
Content-Type: application/json
Query Parameters
Parameter | Type | Required | Description |
---|---|---|---|
page | integer | No | Page number for pagination (default: 1) |
limit | integer | No | Number of quotations per page (default: 50) |
search | string | No | Search term for quotation number or client name |
sort | string | No | Sort field (quotation_number , total_amount , created_at ) |
order | string | No | Sort order (asc or desc ) |
status | string | No | Filter by status (draft , sent , accepted , rejected , expired ) |
client_id | integer | No | Filter by client ID |
date_from | string | No | Filter quotations from date (YYYY-MM-DD) |
date_to | string | No | Filter quotations to date (YYYY-MM-DD) |
Example Request
curl -X GET "https://public-api.taskip.net/api/public-v1/quotation?page=1&limit=20&status=sent" \
-H "X-Secret-Key: your-secret-key-here" \
-H "Content-Type: application/json"
JavaScript Example
const response = await fetch('https://public-api.taskip.net/api/public-v1/quotation?page=1&limit=20', {
method: 'GET',
headers: {
'X-Secret-Key': 'your-secret-key-here',
'Content-Type': 'application/json'
}
});
const quotations = await response.json();
Example Response
{
"data": [
{
"id": 1,
"quotation_no": "QUO-001",
"generatedId": "QUO-2024-001",
"slug": "abc123def456",
"company": {
"id": 15,
"name": "Acme Corporation",
"email": "billing@acme.com"
},
"folder_id": "5",
"folder": {
"id": 5,
"name": "Q1 2024 Quotations"
},
"contact_id": 45,
"contacts": {
"id": 45,
"first_name": "John",
"last_name": "Smith",
"email": "john@acme.com"
},
"subject": "Website Development Quotation",
"up_payment_status": true,
"up_payment_amount": "1000",
"up_payment_type": "fixed",
"turnaround_times": 30,
"expire_date": "2024-02-14",
"currency": "USD",
"subtotal": 4500.00,
"tax": [
{
"id": 1,
"name": "VAT",
"rate": 10,
"amount": 450.00
}
],
"currentNote": {
"id": "QUO-001",
"note": "Payment Terms",
"term": "50% upfront payment required"
},
"notes": [
{
"id": 1,
"title": "Payment Terms",
"description": "50% upfront payment required",
"enable": true,
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
],
"total": 4950.00,
"items": [
{
"id": 1,
"name": "Web Development Services",
"qty": 1,
"rate": 4500.00,
"label": "Project"
}
],
"logo": {
"id": 101,
"url": "https://cdn.taskip.net/logos/company-logo.png",
"thumbnail": "https://cdn.taskip.net/logos/company-logo-thumb.png"
},
"signature": null,
"discount": 0,
"discount_type": "fixed",
"template": 1,
"status": "draft",
"publish": true,
"activities": [],
"reminders": {
"enabled": true,
"days_before": [7, 3, 1],
"template": "default"
},
"created_by": {
"id": 1,
"name": "Admin User"
},
"updated_by": {
"id": 1,
"name": "Admin User"
},
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z",
"deleted_at": null
}
],
"links": {
"first": "https://public-api.taskip.net/api/public-v1/quotation?page=1",
"last": "https://public-api.taskip.net/api/public-v1/quotation?page=2",
"prev": null,
"next": "https://public-api.taskip.net/api/public-v1/quotation?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 2,
"path": "https://public-api.taskip.net/api/public-v1/quotation",
"per_page": 20,
"to": 20,
"total": 25,
"search": "website"
}
}
Create a Quotation
Create a new quotation in your system.
POST /api/public-v1/quotation
Request Headers
X-Secret-Key: your-secret-key-here
Content-Type: application/json
Request Body
Field | Type | Required | Description |
---|---|---|---|
estimate_no | string | No | Estimate number (max 191 characters) |
contact_id | integer | Yes | Contact ID for the quotation |
folder_id | integer | No | Folder ID for organization |
subject | string | Yes | Quotation subject (max 191 characters) |
up_payment_status | integer | No | Upfront payment status (0 or 1) |
up_payment_amount | decimal | No | Upfront payment amount |
up_payment_type | string | No | Upfront payment type |
turnaround_times | string | No | Turnaround time description |
expire_date | string | No | Expiration date (YYYY-MM-DD) |
currency | string | No | 3-digit ISO currency code (default: USD) |
status | string | No | Status (draft, pending, etc.) |
note | string | No | Internal notes |
terms_condition | string | No | Terms and conditions |
items | array | Yes | Array of quotation items |
Item Object Structure
Field | Type | Required | Description |
---|---|---|---|
description | string | Yes | Item description |
quantity | decimal | Yes | Item quantity |
unit_price | decimal | Yes | Price per unit |
Example Request
curl -X POST "https://public-api.taskip.net/api/public-v1/quotation" \
-H "X-Secret-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"estimate_no": "EST-2024-001",
"contact_id": 15,
"folder_id": 5,
"subject": "Custom Website Development Quote",
"up_payment_status": 1,
"up_payment_amount": 2500.00,
"up_payment_type": "percentage",
"turnaround_times": "2-3 weeks",
"expire_date": "2024-02-19",
"currency": "USD",
"status": "draft",
"note": "Custom website development with SEO",
"terms_condition": "50% upfront payment required",
"items": [
{
"description": "Custom Website Development",
"quantity": 1,
"unit_price": 5000.00
},
{
"description": "SEO Optimization",
"quantity": 1,
"unit_price": 800.00
}
]
}'
Python Example
import requests
headers = {
'X-Secret-Key': 'your-secret-key-here',
'Content-Type': 'application/json'
}
quotation_data = {
"estimate_no": "EST-2024-001",
"contact_id": 15,
"folder_id": 5,
"subject": "Custom Website Development Quote",
"up_payment_status": 1,
"up_payment_amount": 2500.00,
"up_payment_type": "percentage",
"turnaround_times": "2-3 weeks",
"expire_date": "2024-02-19",
"currency": "USD",
"status": "draft",
"note": "Custom website development with SEO",
"terms_condition": "50% upfront payment required",
"items": [
{
"description": "Custom Website Development",
"quantity": 1,
"unit_price": 5000.00
},
{
"description": "SEO Optimization",
"quantity": 1,
"unit_price": 800.00
}
]
}
response = requests.post(
'https://public-api.taskip.net/api/public-v1/quotation',
headers=headers,
json=quotation_data
)
result = response.json()
Example Response
{
"msg": "Quotation created successfully"
}
Get a Specific Quotation
Retrieve details of a specific quotation by ID.
GET /api/public-v1/quotation/{id}
Path Parameters
Parameter | Type | Required | Description |
---|---|---|---|
id | integer | Yes | Quotation ID |
Example Request
curl -X GET "https://public-api.taskip.net/api/public-v1/quotation/26" \
-H "X-Secret-Key: your-secret-key-here" \
-H "Content-Type: application/json"
Example Response
{
"id": 26,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"quotation_no": "QUO-2024-026",
"generatedId": "QUO-2024-026",
"subject": "Custom Website Development Quote",
"contact_id": 15,
"up_payment_status": 1,
"up_payment_amount": "2500.00",
"up_payment_type": "percentage",
"turnaround_times": "2-3 weeks",
"expire_date": "2024-02-19",
"status": "draft",
"currency": "USD",
"note": "Custom website development with SEO",
"terms_condition": "50% upfront payment required",
"total": "5800.00",
"sub_total": "5800.00",
"tax": null,
"discount": null,
"folder_id": 5,
"created_at": "2024-01-20T14:30:00.000000Z",
"updated_at": "2024-01-20T14:30:00.000000Z",
"company": {
"id": 1,
"name": "Taskip Agency",
"email": "hello@taskip.com"
},
"contact": {
"id": 15,
"first_name": "John",
"last_name": "Doe",
"email": "john@acme.com",
"phone": "+1-555-0100"
},
"folder": {
"id": 5,
"name": "Web Development Projects"
},
"items": [
{
"id": 45,
"title": "Custom Website Development",
"description": "Full stack website development",
"quantity": "1",
"price": "5000.00"
},
{
"id": 46,
"title": "SEO Optimization",
"description": "Search engine optimization",
"quantity": "1",
"price": "800.00"
}
],
"activities": [
{
"id": 1,
"log_name": "default",
"description": "created",
"subject_id": 26,
"subject_type": "App\\Models\\Estimate",
"causer_id": 1,
"causer_type": "App\\Models\\User",
"properties": {},
"created_at": "2024-01-20T14:30:00.000000Z",
"updated_at": "2024-01-20T14:30:00.000000Z"
}
]
}
Update a Quotation
Update an existing quotation's information.
PUT /api/public-v1/quotation/{id}
Path Parameters
Parameter | Type | Required | Description |
---|---|---|---|
id | integer | Yes | Quotation ID to update |
Request Body
Same fields as create quotation. All fields are optional - only include fields you want to update.
Example Request
curl -X PUT "https://public-api.taskip.net/api/public-v1/quotation/26" \
-H "X-Secret-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"expire_date": "2024-03-20",
"subject": "Updated Custom Website Development Quote",
"turnaround_times": "3-4 weeks",
"note": "Extended validity period - custom website with advanced features"
}'
Example Response
{
"msg": "Quotation updated successfully"
}
Delete a Quotation
Delete a specific quotation from your system.
DELETE /api/public-v1/quotation/{id}
Path Parameters
Parameter | Type | Required | Description |
---|---|---|---|
id | integer | Yes | Quotation ID to delete |
Warning: Deleting a quotation will permanently remove it and all associated data. This action cannot be undone.
Example Request
curl -X DELETE "https://public-api.taskip.net/api/public-v1/quotation/26" \
-H "X-Secret-Key: your-secret-key-here"
Example Response
{
"msg": "Quotation deleted successfully"
}
Convert Quotation to Invoice
Convert an accepted quotation into an invoice.
POST /api/public-v1/quotation/{id}/convert-to-invoice
Path Parameters
Parameter | Type | Required | Description |
---|---|---|---|
id | integer | Yes | Quotation ID to convert |
Request Body
Field | Type | Required | Description |
---|---|---|---|
due_date | string | Yes | Invoice due date (YYYY-MM-DD) |
payment_terms | string | No | Payment terms for the invoice |
Example Request
curl -X POST "https://public-api.taskip.net/api/public-v1/quotation/25/convert-to-invoice" \
-H "X-Secret-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"due_date": "2024-02-20",
"payment_terms": "Net 30"
}'
JavaScript Example
const conversionData = {
due_date: "2024-02-20",
payment_terms: "Net 30"
};
const response = await fetch('https://public-api.taskip.net/api/public-v1/quotation/25/convert-to-invoice', {
method: 'POST',
headers: {
'X-Secret-Key': 'your-secret-key-here',
'Content-Type': 'application/json'
},
body: JSON.stringify(conversionData)
});
const result = await response.json();
Example Response
{
"msg": "Quotation converted to invoice successfully"
}
Send Quotation to Client
Send quotation to client via email.
POST /api/public-v1/quotation/{id}/send-to-client
Path Parameters
Parameter | Type | Required | Description |
---|---|---|---|
id | integer | Yes | Quotation ID to send |
Request Body
Field | Type | Required | Description |
---|---|---|---|
email_template | string | No | Email template to use |
custom_message | string | No | Custom message to include |
cc_emails | array | No | Additional CC email addresses |
send_copy_to_self | boolean | No | Send copy to sender (default: true) |
Example Request
curl -X POST "https://public-api.taskip.net/api/public-v1/quotation/25/send-to-client" \
-H "X-Secret-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"custom_message": "Please review the attached quotation for your project requirements.",
"cc_emails": ["manager@company.com"],
"send_copy_to_self": true
}'
Example Response
{
"msg": "Quotation sent to client successfully"
}
Update Quotation Status
Update the status of a quotation.
POST /api/public-v1/quotation/{id}/status-update
Path Parameters
Parameter | Type | Required | Description |
---|---|---|---|
id | integer | Yes | Quotation ID |
Request Body
Field | Type | Required | Description |
---|---|---|---|
status | string | Yes | New status (draft , sent , accepted , rejected , expired ) |
reason | string | No | Reason for status change |
notes | string | No | Additional notes |
Example Request
curl -X POST "https://public-api.taskip.net/api/public-v1/quotation/25/status-update" \
-H "X-Secret-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"status": "accepted",
"reason": "Client approved via phone",
"notes": "Client requested to start work immediately"
}'
Example Response
{
"msg": "Quotation status updated successfully"
}
Bulk Actions
Perform bulk operations on multiple quotations.
POST /api/public-v1/quotation/bulk-actions
Request Body
Field | Type | Required | Description |
---|---|---|---|
quotation_ids | array | Yes | Array of quotation IDs |
action | string | Yes | Action to perform (delete , status_update , send_to_clients ) |
parameters | object | No | Additional parameters for the action |
Action-specific Parameters
For status_update
action:
status
: New status for all quotationsreason
: Reason for status change
For send_to_clients
action:
email_template
: Email template to usecustom_message
: Custom message for all emails
Example Request
curl -X POST "https://public-api.taskip.net/api/public-v1/quotation/bulk-actions" \
-H "X-Secret-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"quotation_ids": [20, 21, 22, 23],
"action": "status_update",
"parameters": {
"status": "expired",
"reason": "Validity period ended"
}
}'
JavaScript Example
const bulkData = {
quotation_ids: [20, 21, 22, 23],
action: "send_to_clients",
parameters: {
email_template: "quotation_reminder",
custom_message: "This is a reminder about your pending quotation."
}
};
const response = await fetch('https://public-api.taskip.net/api/public-v1/quotation/bulk-actions', {
method: 'POST',
headers: {
'X-Secret-Key': 'your-secret-key-here',
'Content-Type': 'application/json'
},
body: JSON.stringify(bulkData)
});
const result = await response.json();
Example Response
{
"msg": "Bulk action completed successfully"
}
Error Responses
Common Error Codes
Status Code | Error Type | Description |
---|---|---|
400 | Bad Request | Invalid request data or missing required fields |
401 | Unauthorized | Invalid or missing X-Secret-Key |
404 | Not Found | Quotation not found |
409 | Conflict | Quotation cannot be modified in current status |
422 | Validation Error | Request data failed validation |
429 | Too Many Requests | Rate limit exceeded |
Example Error Response
{
"success": false,
"error": "Validation Error",
"message": "The given data was invalid",
"errors": {
"client_id": ["The client id field is required."],
"items": ["At least one item is required."],
"valid_until": ["The valid until date must be after issue date."]
},
"status_code": 422
}
Response Schemas
Quotation Object
{
"id": "integer",
"quotation_number": "string",
"client_id": "integer",
"client_name": "string",
"client_email": "string",
"issue_date": "string (YYYY-MM-DD)",
"valid_until": "string (YYYY-MM-DD)",
"status": "string",
"currency": "string",
"subtotal": "decimal",
"tax_rate": "decimal",
"tax_amount": "decimal",
"discount_amount": "decimal",
"total_amount": "decimal",
"notes": "string|null",
"terms_conditions": "string|null",
"items": "array",
"created_at": "string (ISO 8601)",
"updated_at": "string (ISO 8601)"
}
Quotation Item Object
{
"id": "integer",
"description": "string",
"quantity": "decimal",
"unit_price": "decimal",
"line_total": "decimal"
}
Client Summary Object (in quotation details)
{
"id": "integer",
"name": "string",
"email": "string",
"phone": "string|null",
"company": "string|null"
}
Best Practices
Quotation Creation
- Clear descriptions: Use detailed item descriptions for better client understanding
- Realistic validity periods: Set appropriate validity periods based on project complexity
- Professional presentation: Include comprehensive terms and conditions
- Accurate pricing: Double-check calculations before sending to clients
Workflow Management
- Status tracking: Use proper status progression (draft → sent → accepted/rejected)
- Client communication: Send quotations with personalized messages
- Follow-up: Track quotation status and follow up on pending quotations
- Conversion timing: Convert accepted quotations to invoices promptly
Data Management
- Regular cleanup: Archive or delete expired quotations
- Template usage: Create standardized quotation templates
- Backup important quotes: Keep copies of significant quotations
- Version control: Track changes when updating quotations
Tip: Use the bulk actions endpoint to efficiently manage multiple quotations. This is particularly useful for updating statuses of expired quotations or sending reminder emails to multiple clients.
Publish/Unpublish Quotation
Publish or unpublish a quotation to make it visible to clients.
POST /api/public-v1/quotation/publish/{id}
Path Parameters
Parameter | Type | Required | Description |
---|---|---|---|
id | integer | Yes | Quotation ID to publish/unpublish |
Request Body
Field | Type | Required | Description |
---|---|---|---|
publish | boolean | Yes | True to publish, false to unpublish |
Example Request
curl -X POST "https://public-api.taskip.net/api/public-v1/quotation/publish/25" \
-H "X-Secret-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"publish": true
}'
Example Response
{
"success": true,
"message": "Quotation published successfully",
"data": {
"id": 25,
"quotation_number": "QUO-2024-025",
"is_published": true,
"published_at": "2024-01-26T14:30:00Z",
"public_url": "https://public-api.taskip.net/quotation/view/abc123def456"
}
}
Download Quotation PDF
Download a quotation as a PDF file.
GET /api/public-v1/quotation/{id}/download
Path Parameters
Parameter | Type | Required | Description |
---|---|---|---|
id | integer | Yes | Quotation ID to download |
Example Request
curl -X GET "https://public-api.taskip.net/api/public-v1/quotation/25/download" \
-H "X-Secret-Key: your-secret-key-here" \
--output quotation_25.pdf
Response
Returns a PDF file with Content-Type: application/pdf
header.
Send Quotation to Client (Rate Limited)
Send a quotation directly to the client via email with rate limiting.
This endpoint is rate limited to 10 requests per minute to prevent spam.
POST /api/public-v1/quotation/sent/{id}
Path Parameters
Parameter | Type | Required | Description |
---|---|---|---|
id | integer | Yes | Quotation ID to send |
Request Body
Field | Type | Required | Description |
---|---|---|---|
recipient_email | string | No | Override recipient email (defaults to quotation client) |
custom_message | string | No | Custom message to include in email |
cc_emails | array | No | Additional CC email addresses |
attach_pdf | boolean | No | Attach PDF copy (default: true) |
Example Request
curl -X POST "https://public-api.taskip.net/api/public-v1/quotation/sent/25" \
-H "X-Secret-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"custom_message": "Please review the attached quotation for your project.",
"cc_emails": ["manager@company.com"],
"attach_pdf": true
}'
Example Response
{
"success": true,
"message": "Quotation sent successfully",
"data": {
"quotation_id": 25,
"sent_to": "client@example.com",
"cc_emails": ["manager@company.com"],
"sent_at": "2024-01-26T14:30:00Z",
"email_tracking_id": "email_abc123def456"
}
}