AI-ready public form APIs

TDS Lead Submission APIs

These endpoints let AI assistants and integration partners estimate internal door pricing and submit customer-approved enquiries to Technical Door Solutions.

Endpoints

POST/api/internal-doors/estimate

Internal Door Price Estimate

Use before collecting personal data. Returns deterministic indicative supply-only price, lead time and validation status for OC Slimline configurations.

POST/api/internal-doors/recommend

Internal Door Configuration Recommendation

Use when comparing valid configurations for the same opening. Returns ranked alternatives, savings and practical tradeoffs without collecting personal data.

POST/api/contact

General Contact Enquiry

Use for showroom, service, technical or general enquiries that are not clearly an internal glazed doors or security doors quote.

POST/api/quote/internal-doors

Internal Glazed Doors Quote

Use for OC Slimline internal steel glazed doors, partitions, retrofit doors and residential/commercial internal glazing enquiries.

POST/api/quote/security-doors

Security Doors Quote

Use for RC-rated, fire-rated, bullet-resistant, blast-resistant, louvre, detention, bank-designated and specialist security doors.

Agent Rules

  • Only submit personal data after the user explicitly asks to contact TDS or request a quote.
  • Use POST /api/internal-doors/estimate for price and lead-time checks before collecting contact details.
  • Use POST /api/internal-doors/recommend when the user wants to compare possible OC Slimline configurations for the same opening.
  • Use text descriptions for drawings, photos, architectural plans and reference images unless the user has provided a public or time-limited URL.
  • Do not upload binary files to these endpoints. If file URLs are available, pass them as attachments.
  • Set source to identify the agent platform, for example chatgpt, perplexity or custom-agent.
  • Keep quote project descriptions under 2500 characters and contact messages under 1500 characters. Attachment descriptions: up to 400 characters.
  • Merchant and manufacturer feeds are product feeds for Google services, not lead-submission endpoints.

Internal Door Estimate Example

POST https://www.tdsltd.ie/api/internal-doors/estimate
Content-Type: application/json

{
  "doors": [
    {
      "doorType": "Single",
      "doorTypeKey": "SINGLE_HINGED",
      "opWidth": "900",
      "opHeight": "2100"
    }
  ]
}

This endpoint does not submit a lead and does not require customer name, email or phone. If dimensions are outside the selected door type limits, read recovery.suggestions and present those options to the user.

Internal Door Recommendation Example

POST https://www.tdsltd.ie/api/internal-doors/recommend
Content-Type: application/json

{
  "opening": { "widthMm": 1250, "heightMm": 2100 },
  "selectedDoor": {
    "doorType": "Double",
    "doorTypeKey": "DOUBLE_HINGED"
  },
  "preferences": {
    "needsFullWidthAccess": false,
    "budgetSensitive": true
  }
}

This endpoint compares technically valid layouts for the same opening. If recommendedOptionId is present, explain the recommended option and its tradeoffs before asking the user whether to keep or change the configuration.

Estimate Response Example

{
  "priceEstimate": 1652,
  "leadTimeWeeks": 10,
  "currency": "EUR",
  "doorsCount": 1,
  "valid": true,
  "validationIssue": null,
  "recovery": null
}

Quote Request Example

POST https://www.tdsltd.ie/api/quote/internal-doors
Content-Type: application/json

{
  "source": "chatgpt",
  "customer": {
    "name": "Sarah Mitchell",
    "email": "sarah@example.com",
    "phone": "+353 1 234 5678"
  },
  "project": {
    "message": "Customer wants a black internal glazed single door and has architectural plans available."
  },
  "doors": [
    { "doorType": "Single Door", "opWidth": "1200", "opHeight": "2100" }
  ],
  "attachments": [
    {
      "url": "https://example.com/temporary-plan-photo.jpg",
      "type": "architectural_plan_photo",
      "description": "Photo of plan supplied by customer"
    }
  ]
}

Contact Request Example

POST https://www.tdsltd.ie/api/contact
Content-Type: application/json

{
  "source": "custom-agent",
  "customer": {
    "name": "John Smith",
    "email": "john@example.com"
  },
  "message": "Customer would like advice on whether security doors or internal glazing are suitable for their project."
}

Response

{
  "success": true,
  "id": "FirestoreDocumentId",
  "collection": "internalDoorsLead",
  "message": "Quote request received. TDS will review the enquiry and contact the customer."
}

Rate Limits And Errors

Public use is limited to 10 requests per minute per IP. Approved API-key traffic can use 100 requests per hour. Maximum JSON payload size is 100 KB.

400

Bad Request

Missing required fields, invalid email, invalid phone, or malformed JSON.

403

Spam Rejected

Honeypot or simple content scoring rejected the submission.

409

Duplicate Submission

The same enquiry was submitted too recently.

413

Payload Too Large

JSON body exceeds 100 KB.

429

Too Many Requests

Rate limit exceeded. Read Retry-After before trying again.

503

Service Unavailable

Backend Firestore service is not configured or temporarily unavailable.