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/quotationRequest Headers
X-Secret-Key: your-secret-key-here
Content-Type: application/jsonQuery 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 ( ascordesc) | 
| 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/quotationRequest Headers
X-Secret-Key: your-secret-key-here
Content-Type: application/jsonRequest 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-invoicePath 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-clientPath 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-updatePath 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-actionsRequest 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 quotations
- reason: Reason for status change
For send_to_clients action:
- email_template: Email template to use
- custom_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}/downloadPath 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.pdfResponse
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"
  }
}