Skip to content

Document API Specification

Overview

The Document API provides endpoints for document generation, quote management, file uploads, and payment registration.

Base Path: /document

Content Types: - Request: application/json - Response: application/json or application/octet-stream (for PDF downloads)

Response Format

All endpoints return a TlinqApiResponse object (or binary data for PDFs):

{
  "apiStatus": {
    "errorCode": "OK",
    "errorMessage": "Success"
  },
  "apiData": { ... }
}

Date Format: All dates are returned in ISO 8601 format (yyyy-MM-dd'T'HH:mm:ss)


Invoice Printing Endpoints

POST /document/printInvoice

Generates and downloads an invoice as PDF.

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | No | User session token | | docnum | string | Yes | Invoice document number |

Request Example:

{
  "session": "user-session-token",
  "docnum": "INV-2025-001234"
}

Response: Returns a PDF file as binary stream with Content-Disposition header.

Error Codes: - MISSING_PARAMETER - Document number not provided


GET /document/printInvoice

Generates and downloads an invoice as PDF (GET version).

Query Parameters: | Field | Type | Required | Description | |-------|------|----------|-------------| | token | string | No | User session token | | docnum | string | Yes | Invoice document number |


Quote Printing Endpoints

POST /document/printQuote

Generates and downloads a quote as PDF.

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | No | User session token | | docnum | string | Yes | Quote document number |

Request Example:

{
  "session": "user-session-token",
  "docnum": "QT-2025-001234"
}

Response: Returns a PDF file as binary stream.


GET /document/printQuote

Generates and downloads a quote as PDF (GET version).

Query Parameters: | Field | Type | Required | Description | |-------|------|----------|-------------| | token | string | No | User session token | | docnum | string | Yes | Quote document number |


Quote Management Endpoints

POST /document/createQuote

Creates a new quote for a customer.

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | No | User session token | | customerId | integer | Yes | Customer ID | | currencyId | integer | No | Currency ID | | items | array | No | Array of quote items |

Request Example:

{
  "session": "user-session-token",
  "customerId": 1001,
  "currencyId": 1,
  "items": [
    {
      "description": "Desert Safari Premium - 2 Adults",
      "quantity": 2,
      "unitPrice": 299.00,
      "productId": 1001
    },
    {
      "description": "Desert Safari Premium - 1 Child",
      "quantity": 1,
      "unitPrice": 199.00,
      "productId": 1001
    }
  ]
}

Response Structure:

{
  "apiStatus": { "errorCode": "OK", "errorMessage": "Success" },
  "apiData": {
    "quoteId": 5001,
    "quoteNumber": "QT-2025-001234",
    "customerId": 1001,
    "customerName": "John Smith",
    "currencyId": 1,
    "currencyCode": "AED",
    "totalAmount": 797.00,
    "status": "DRAFT",
    "createDate": "2025-06-15T10:30:00",
    "validUntil": "2025-07-15T23:59:59",
    "createdBy": 101,
    "items": [
      {
        "itemId": 10001,
        "description": "Desert Safari Premium - 2 Adults",
        "quantity": 2,
        "unitPrice": 299.00,
        "totalPrice": 598.00
      },
      {
        "itemId": 10002,
        "description": "Desert Safari Premium - 1 Child",
        "quantity": 1,
        "unitPrice": 199.00,
        "totalPrice": 199.00
      }
    ]
  }
}


POST /document/addQuoteItem

Adds items to an existing quote.

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | No | User session token | | quoteId | integer | Yes | Quote ID to add items to | | items | array | Yes | Array of quote items to add |

Request Example:

{
  "session": "user-session-token",
  "quoteId": 5001,
  "items": [
    {
      "description": "Private Transfer - Dubai Hotel to Airport",
      "quantity": 1,
      "unitPrice": 150.00
    }
  ]
}

Response Structure:

{
  "apiStatus": { "errorCode": "OK", "errorMessage": "Success" },
  "apiData": {
    "quoteId": 5001,
    "quoteNumber": "QT-2025-001234",
    "totalAmount": 947.00,
    "items": [
      {
        "itemId": 10001,
        "description": "Desert Safari Premium - 2 Adults",
        "quantity": 2,
        "unitPrice": 299.00,
        "totalPrice": 598.00
      },
      {
        "itemId": 10002,
        "description": "Desert Safari Premium - 1 Child",
        "quantity": 1,
        "unitPrice": 199.00,
        "totalPrice": 199.00
      },
      {
        "itemId": 10003,
        "description": "Private Transfer - Dubai Hotel to Airport",
        "quantity": 1,
        "unitPrice": 150.00,
        "totalPrice": 150.00
      }
    ]
  }
}


POST /document/getQuote

Retrieves a quote by ID or number.

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | No | User session token | | quoteId | integer | No | Quote ID | | quoteNumber | string | No | Quote number |

*Either quoteId or quoteNumber must be provided.

Request Example:

{
  "session": "user-session-token",
  "quoteNumber": "QT-2025-001234"
}

Response Structure:

{
  "apiStatus": { "errorCode": "OK", "errorMessage": "Success" },
  "apiData": {
    "quoteId": 5001,
    "quoteNumber": "QT-2025-001234",
    "customerId": 1001,
    "customerName": "John Smith",
    "currencyId": 1,
    "currencyCode": "AED",
    "totalAmount": 947.00,
    "status": "DRAFT",
    "createDate": "2025-06-15T10:30:00",
    "validUntil": "2025-07-15T23:59:59",
    "createdBy": 101
  }
}


POST /document/getQuoteItems

Retrieves items for a quote.

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | No | User session token | | quoteId | integer | Yes | Quote ID |

Request Example:

{
  "session": "user-session-token",
  "quoteId": 5001
}

Response Structure:

{
  "apiStatus": { "errorCode": "OK", "errorMessage": "Success" },
  "apiData": [
    {
      "itemId": 10001,
      "quoteId": 5001,
      "description": "Desert Safari Premium - 2 Adults",
      "quantity": 2,
      "unitPrice": 299.00,
      "totalPrice": 598.00,
      "productId": 1001,
      "productName": "Desert Safari Premium"
    },
    {
      "itemId": 10002,
      "quoteId": 5001,
      "description": "Desert Safari Premium - 1 Child",
      "quantity": 1,
      "unitPrice": 199.00,
      "totalPrice": 199.00,
      "productId": 1001,
      "productName": "Desert Safari Premium"
    }
  ]
}


POST /document/getCustomerQuotes

Retrieves all quotes for a customer.

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | No | User session token | | customerId | integer | Yes | Customer ID |

Request Example:

{
  "session": "user-session-token",
  "customerId": 1001
}

Response Structure:

{
  "apiStatus": { "errorCode": "OK", "errorMessage": "Success" },
  "apiData": [
    {
      "quoteId": 5001,
      "quoteNumber": "QT-2025-001234",
      "customerId": 1001,
      "totalAmount": 947.00,
      "status": "DRAFT",
      "createDate": "2025-06-15T10:30:00"
    },
    {
      "quoteId": 5002,
      "quoteNumber": "QT-2025-001235",
      "customerId": 1001,
      "totalAmount": 2500.00,
      "status": "SENT",
      "createDate": "2025-06-10T14:00:00"
    }
  ]
}


POST /document/getMyQuotes

Retrieves quotes for the currently logged-in user.

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | Yes | User session token |

Request Example:

{
  "session": "user-session-token"
}

Response Structure: Same as /document/getCustomerQuotes.

Error Codes: - NOT_LOGGED_IN - User must be logged in


POST /document/searchQuotes

Searches quotes by various criteria (employees only).

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | Yes | User session token | | searchType | string | Yes | Search type: "NUM", "CUST", "DATE", or "USER" | | quoteNumber | string | No | Quote number (for NUM search) | | customerId | integer | No | Customer ID (for CUST search) | | fromDate | string | No | Start date (for DATE search) | | toDate | string | No | End date (for DATE search) |

Request Example:

{
  "session": "user-session-token",
  "searchType": "DATE",
  "fromDate": "2025-06-01",
  "toDate": "2025-06-30"
}

Response Structure:

{
  "apiStatus": { "errorCode": "OK", "errorMessage": "Success" },
  "apiData": [
    {
      "quoteId": 5001,
      "quoteNumber": "QT-2025-001234",
      "customerId": 1001,
      "customerName": "John Smith",
      "totalAmount": 947.00,
      "status": "DRAFT",
      "createDate": "2025-06-15T10:30:00"
    }
  ]
}


Payment Management Endpoints

POST /document/registerPayment

Registers a payment for an invoice.

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | Yes | User session token | | invoice | string | Yes | Invoice number | | online | boolean | No | Whether payment was made online |

Request Example:

{
  "session": "user-session-token",
  "invoice": "INV-2025-001234",
  "online": true
}

Response Structure:

{
  "apiStatus": { "errorCode": "OK", "errorMessage": "Success" },
  "apiData": {
    "paymentId": 8001,
    "invoiceNumber": "INV-2025-001234",
    "amount": 947.00,
    "paymentDate": "2025-06-15T11:00:00",
    "online": true,
    "paymentMethod": "CARD",
    "status": "COMPLETED"
  }
}


File Upload Endpoints

POST /document/upload

Uploads a file (multipart form).

Form Parameters: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | No | User session token | | fileToUpload | file | Yes | File to upload |

Response Structure:

{
  "apiStatus": { "errorCode": "OK", "errorMessage": "Success" },
  "apiData": {
    "receivedSize": 12345,
    "originalName": "passport.pdf",
    "savedFileName": "abc123-passport.pdf"
  }
}


POST /document/upload2

Uploads a file (Base64 encoded).

Request Body: | Field | Type | Required | Description | |-------|------|----------|-------------| | session | string | No | User session token | | fileToUpload | string | Yes | Base64-encoded file content | | fileName | string | No | Original file name | | uploadedFileName | string | No | Target file name |

Request Example:

{
  "session": "user-session-token",
  "fileToUpload": "JVBERi0xLjQKJeLjz9MK...",
  "fileName": "visa_document.pdf"
}

Response Structure:

{
  "apiStatus": { "errorCode": "OK", "errorMessage": "Success" },
  "apiData": {
    "receivedSize": 45678,
    "originalName": "visa_document.pdf",
    "savedFileName": "xyz789-visa_document.pdf"
  }
}


Data Models

CQuote

Field Type Description
quoteId integer Unique quote identifier
quoteNumber string Quote document number
customerId integer Customer ID
customerName string Customer name
currencyId integer Currency ID
currencyCode string Currency code
totalAmount number Total amount
status string Quote status (DRAFT, SENT, ACCEPTED, REJECTED)
createDate datetime Creation date
validUntil datetime Quote validity date
createdBy integer User ID who created
items array Quote items array

CQuoteItem

Field Type Description
itemId integer Item identifier
quoteId integer Parent quote ID
description string Item description
quantity number Quantity
unitPrice number Price per unit
totalPrice number Total price for item
productId integer Product ID (if applicable)
productName string Product name

CPayment

Field Type Description
paymentId integer Payment identifier
invoiceNumber string Related invoice
amount number Payment amount
paymentDate datetime Date of payment
online boolean Online payment flag
paymentMethod string Payment method (CARD, CASH, BANK)
status string Payment status