Contractor bid template for comparing offers

Updated 2026-10-30

Bids arrive as PDFs, emails and phone calls, and none of them include the same things. Comparing them takes an evening. I would rather every contractor answer the same questions, so the numbers line up. This also works as a bid request form.

Write the scope of the job in one clear message. Give each contractor the same link and the same deadline, and set close_at to that deadline. Ask each one to name the project in the first question.

While bids come in

Each contractor gives a total price, what it includes and excludes, a start date and the working days the job takes. They list payment stages they propose, say if they hold the license and insurance the work needs, state the warranty and share a link to past work. A contractor's AI might ask "What is your total price?" Then "What is not included?" Then "When can you start?" It shows the answers and sends only after a yes. See agent-fillable forms.

After the deadline

Download the CSV and put totals beside exclusions. A low total with a long exclusion list may not be cheaper. This is a form, not legal advice. A bid is not a contract, so have a professional check your contract wording. Browse forms for home services and trades. A quote request form starts the conversation, and a work order request follows once you pick a contractor.

Questions

How do I set a bid deadline?

Set close_at to the deadline you give contractors. After that time the link takes no new bids. You can reopen it if you invite one more contractor.

Why are license numbers not asked?

The form asks only whether the contractor holds the license the work needs. Check license details with the licensing body yourself, since the form does not verify anything.

Can contractors attach their proposal?

Not as a file, because uploads are not supported. They can paste a link to past work or a shared document, and the details of the bid go in the form.

Try the form

Live demo ยท nothing is saved

Submit your bid

Please fill in one bid for the project named below. Use the same terms you would put in a written proposal.

I hold the license this work needs in my area
I carry liability insurance for this work
I confirm these details are accurate (required)

Or paste the JSON

Give this to your AI. It needs the AI Form API MCP server or an API key. It makes the form and sends you the link.

text
Create this form with the AI Form API create_form tool (or POST https://aiformapi.com/v1/forms with my API key). Then reply with the public_url.

{
  "title": "Submit your bid",
  "description": "Please fill in one bid for the project named below. Use the same terms you would put in a written proposal.",
  "fields": [
    {
      "id": "bidder_company",
      "label": "Company name",
      "type": "short_text",
      "required": true,
      "max_length": 150
    },
    {
      "id": "bidder_contact",
      "label": "Contact person",
      "type": "short_text",
      "required": true,
      "max_length": 150
    },
    {
      "id": "bidder_email",
      "label": "Email",
      "type": "email",
      "required": true
    },
    {
      "id": "bidder_phone",
      "label": "Phone",
      "type": "phone",
      "required": true
    },
    {
      "id": "project_reference",
      "label": "Which project is this bid for?",
      "type": "short_text",
      "required": true,
      "max_length": 200
    },
    {
      "id": "bid_total",
      "label": "Total price for the whole job, in your local currency",
      "type": "number",
      "required": true,
      "min": 0
    },
    {
      "id": "price_includes",
      "label": "What the price includes",
      "type": "long_text",
      "required": true,
      "max_length": 2500
    },
    {
      "id": "price_excludes",
      "label": "What the price does not include",
      "type": "long_text",
      "max_length": 2000
    },
    {
      "id": "earliest_start",
      "label": "Earliest start date",
      "type": "date"
    },
    {
      "id": "working_days",
      "label": "Working days to finish",
      "type": "number",
      "min": 1,
      "max": 730
    },
    {
      "id": "payment_stages",
      "label": "Payment stages you propose",
      "type": "long_text",
      "max_length": 1000
    },
    {
      "id": "holds_needed_license",
      "label": "I hold the license this work needs in my area",
      "type": "checkbox"
    },
    {
      "id": "carries_insurance",
      "label": "I carry liability insurance for this work",
      "type": "checkbox"
    },
    {
      "id": "insurance_valid_until",
      "label": "Insurance valid until",
      "type": "date"
    },
    {
      "id": "warranty_on_work",
      "label": "Warranty you offer on the work",
      "type": "short_text",
      "max_length": 300
    },
    {
      "id": "past_work_url",
      "label": "Link to past work or reviews",
      "type": "url"
    },
    {
      "id": "bid_open_until",
      "label": "This bid stays open until",
      "type": "date"
    },
    {
      "id": "bid_details_accurate",
      "label": "I confirm these details are accurate",
      "type": "checkbox",
      "required": true
    }
  ]
}

Or call the API

bash
curl -X POST https://aiformapi.com/v1/forms \
  -H "Authorization: Bearer $AIFORMAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Submit your bid","description":"Please fill in one bid for the project named below. Use the same terms you would put in a written proposal.","fields":[{"id":"bidder_company","label":"Company name","type":"short_text","required":true,"max_length":150},{"id":"bidder_contact","label":"Contact person","type":"short_text","required":true,"max_length":150},{"id":"bidder_email","label":"Email","type":"email","required":true},{"id":"bidder_phone","label":"Phone","type":"phone","required":true},{"id":"project_reference","label":"Which project is this bid for?","type":"short_text","required":true,"max_length":200},{"id":"bid_total","label":"Total price for the whole job, in your local currency","type":"number","required":true,"min":0},{"id":"price_includes","label":"What the price includes","type":"long_text","required":true,"max_length":2500},{"id":"price_excludes","label":"What the price does not include","type":"long_text","max_length":2000},{"id":"earliest_start","label":"Earliest start date","type":"date"},{"id":"working_days","label":"Working days to finish","type":"number","min":1,"max":730},{"id":"payment_stages","label":"Payment stages you propose","type":"long_text","max_length":1000},{"id":"holds_needed_license","label":"I hold the license this work needs in my area","type":"checkbox"},{"id":"carries_insurance","label":"I carry liability insurance for this work","type":"checkbox"},{"id":"insurance_valid_until","label":"Insurance valid until","type":"date"},{"id":"warranty_on_work","label":"Warranty you offer on the work","type":"short_text","max_length":300},{"id":"past_work_url","label":"Link to past work or reviews","type":"url"},{"id":"bid_open_until","label":"This bid stays open until","type":"date"},{"id":"bid_details_accurate","label":"I confirm these details are accurate","type":"checkbox","required":true}]}'

JSON definition

json
{
  "title": "Submit your bid",
  "description": "Please fill in one bid for the project named below. Use the same terms you would put in a written proposal.",
  "fields": [
    {
      "id": "bidder_company",
      "label": "Company name",
      "type": "short_text",
      "required": true,
      "max_length": 150
    },
    {
      "id": "bidder_contact",
      "label": "Contact person",
      "type": "short_text",
      "required": true,
      "max_length": 150
    },
    {
      "id": "bidder_email",
      "label": "Email",
      "type": "email",
      "required": true
    },
    {
      "id": "bidder_phone",
      "label": "Phone",
      "type": "phone",
      "required": true
    },
    {
      "id": "project_reference",
      "label": "Which project is this bid for?",
      "type": "short_text",
      "required": true,
      "max_length": 200
    },
    {
      "id": "bid_total",
      "label": "Total price for the whole job, in your local currency",
      "type": "number",
      "required": true,
      "min": 0
    },
    {
      "id": "price_includes",
      "label": "What the price includes",
      "type": "long_text",
      "required": true,
      "max_length": 2500
    },
    {
      "id": "price_excludes",
      "label": "What the price does not include",
      "type": "long_text",
      "max_length": 2000
    },
    {
      "id": "earliest_start",
      "label": "Earliest start date",
      "type": "date"
    },
    {
      "id": "working_days",
      "label": "Working days to finish",
      "type": "number",
      "min": 1,
      "max": 730
    },
    {
      "id": "payment_stages",
      "label": "Payment stages you propose",
      "type": "long_text",
      "max_length": 1000
    },
    {
      "id": "holds_needed_license",
      "label": "I hold the license this work needs in my area",
      "type": "checkbox"
    },
    {
      "id": "carries_insurance",
      "label": "I carry liability insurance for this work",
      "type": "checkbox"
    },
    {
      "id": "insurance_valid_until",
      "label": "Insurance valid until",
      "type": "date"
    },
    {
      "id": "warranty_on_work",
      "label": "Warranty you offer on the work",
      "type": "short_text",
      "max_length": 300
    },
    {
      "id": "past_work_url",
      "label": "Link to past work or reviews",
      "type": "url"
    },
    {
      "id": "bid_open_until",
      "label": "This bid stays open until",
      "type": "date"
    },
    {
      "id": "bid_details_accurate",
      "label": "I confirm these details are accurate",
      "type": "checkbox",
      "required": true
    }
  ]
}