> ## Documentation Index
> Fetch the complete documentation index at: https://docs.renovationfind.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Update job status

> Update the post-acceptance job status for a lead.
The lead must have been accepted first.
Once status is set to `JOB_WON` or `LEAD_WON`, it cannot be changed (contact support to update).

Status-specific required fields:
- `MEETUP_SCHEDULED`: `meetingScheduledDate` required
- `JOB_WON`: `jobAmount` required
- `JOB_LOST`, `JOB_POSTPONED_OR_CANCELLED`, `OTHER`: `reason` required (max 500 chars)
- `LEAD_WON`: `jobAmount`, `estimatedProjectStartDate` (or `startDateTbd`), `estimatedCompletionDate` (or `completionDateTbd`) required. Attachment soft-required.
- `LEAD_LOST`: `lostReason` required. `reason` required when `lostReason` is `OTHER`.
- `REACHED_OUT_TO_HOMEOWNER`, `MULTIPLE_ATTEMPTS_NO_RESPONSE`, `CONTACT_MADE`, `ESTIMATE_PROVIDED`: no required fields




## OpenAPI

````yaml /openapi.yaml put /general-leads/{id}/status
openapi: 3.0.3
info:
  title: RenovationFind API
  description: >
    Public REST API for RenovationFind vendor integrations.


    ## Authentication

    All endpoints require a Bearer token in the `Authorization` header.

    Tokens are issued from the RenovationFind Manager Portal.


    ```

    Authorization: Bearer <your_jwt_token>

    ```


    ## Rate Limiting

    API requests are rate-limited to **250 requests per 5 minutes** per vendor.

    When exceeded, the API returns `429 Too Many Requests` with a `Retry-After`
    header.


    ## Response Format

    All responses follow a consistent envelope:

    ```json

    {
      "success": true,
      "data": { ... },
      "message": "Optional message"
    }

    ```

    On error:

    ```json

    {
      "success": false,
      "error": "Error description"
    }

    ```
  version: 1.0.0
  contact:
    name: RenovationFind
    url: https://www.renovationfind.com
servers:
  - url: https://www.renovationfind.com/rest-api-v1
    description: Production
security:
  - BearerAuth: []
paths:
  /general-leads/{id}/status:
    put:
      tags:
        - General Leads
      summary: Update job status
      description: >
        Update the post-acceptance job status for a lead.

        The lead must have been accepted first.

        Once status is set to `JOB_WON` or `LEAD_WON`, it cannot be changed
        (contact support to update).


        Status-specific required fields:

        - `MEETUP_SCHEDULED`: `meetingScheduledDate` required

        - `JOB_WON`: `jobAmount` required

        - `JOB_LOST`, `JOB_POSTPONED_OR_CANCELLED`, `OTHER`: `reason` required
        (max 500 chars)

        - `LEAD_WON`: `jobAmount`, `estimatedProjectStartDate` (or
        `startDateTbd`), `estimatedCompletionDate` (or `completionDateTbd`)
        required. Attachment soft-required.

        - `LEAD_LOST`: `lostReason` required. `reason` required when
        `lostReason` is `OTHER`.

        - `REACHED_OUT_TO_HOMEOWNER`, `MULTIPLE_ATTEMPTS_NO_RESPONSE`,
        `CONTACT_MADE`, `ESTIMATE_PROVIDED`: no required fields
      operationId: updateGeneralLeadStatus
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - status
              properties:
                status:
                  type: string
                  enum:
                    - HOMEOWNER_CONTACTED
                    - MEETUP_SCHEDULED
                    - QUOTE_SENT
                    - JOB_PENDING_DECISION
                    - JOB_WON
                    - JOB_LOST
                    - JOB_POSTPONED_OR_CANCELLED
                    - NO_RESPONSE_FROM_HOMEOWNER
                    - OTHER
                    - REACHED_OUT_TO_HOMEOWNER
                    - MULTIPLE_ATTEMPTS_NO_RESPONSE
                    - CONTACT_MADE
                    - ESTIMATE_PROVIDED
                    - LEAD_WON
                    - LEAD_LOST
                  description: >
                    New job status. Required fields vary by status:

                    - `MEETUP_SCHEDULED`: requires `meetingScheduledDate`

                    - `JOB_WON`: requires `jobAmount` (immutable once set)

                    - `JOB_LOST`, `JOB_POSTPONED_OR_CANCELLED`, `OTHER`:
                    requires `reason`

                    - `LEAD_WON`: requires `jobAmount`,
                    (`estimatedProjectStartDate` or `startDateTbd`),
                    (`estimatedCompletionDate` or `completionDateTbd`).
                    Immutable once set. Attachment soft-required.

                    - `LEAD_LOST`: requires `lostReason`. `reason` required when
                    `lostReason` is `OTHER`.

                    - `REACHED_OUT_TO_HOMEOWNER`,
                    `MULTIPLE_ATTEMPTS_NO_RESPONSE`, `CONTACT_MADE`,
                    `ESTIMATE_PROVIDED`: no required fields
                reason:
                  type: string
                  maxLength: 500
                  description: >-
                    Notes/reason text. Required for JOB_LOST,
                    JOB_POSTPONED_OR_CANCELLED, OTHER. Required for LEAD_LOST
                    when lostReason is OTHER. Optional for all other statuses.
                meetingScheduledDate:
                  type: string
                  format: date
                  description: Required for MEETUP_SCHEDULED
                jobAmount:
                  type: number
                  format: double
                  description: Required for JOB_WON and LEAD_WON
                contactMethod:
                  type: string
                  enum:
                    - PHONE_CALL
                    - TEXT
                    - EMAIL
                    - IN_PERSON_MEETING
                  description: Optional for REACHED_OUT_TO_HOMEOWNER and CONTACT_MADE
                estimateType:
                  type: string
                  enum:
                    - IN_PERSON_ESTIMATE
                    - EMAILED_ESTIMATE
                    - VERBAL_ESTIMATE
                    - PORTAL_ATTACHMENT_ESTIMATE
                    - OTHER
                  description: Optional for ESTIMATE_PROVIDED
                lostReason:
                  type: string
                  enum:
                    - PRICE
                    - TIMING
                    - OTHER
                  description: Required for LEAD_LOST
                estimatedProjectStartDate:
                  type: string
                  format: date
                  description: Required for LEAD_WON (unless startDateTbd is true)
                estimatedCompletionDate:
                  type: string
                  format: date
                  description: Required for LEAD_WON (unless completionDateTbd is true)
                startDateTbd:
                  type: boolean
                  description: Set to true if project start date is TBD (LEAD_WON)
                completionDateTbd:
                  type: boolean
                  description: Set to true if completion date is TBD (LEAD_WON)
            example:
              status: HOMEOWNER_CONTACTED
      responses:
        '200':
          description: Status updated, returns updated lead details
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    type: object
                    description: >
                      Full detail view of a vendor-assigned lead. Includes all
                      fields from the lite view

                      plus post-lead status data and file attachments.
                    allOf:
                      - type: object
                        description: >
                          A vendor-assigned general lead (lite view).

                          Customer contact fields (customerEmail, customerPhone,
                          customerAddress) are null until the lead is accepted.
                        properties:
                          id:
                            type: integer
                            format: int64
                          dateCreated:
                            type: string
                            format: date-time
                          dateModified:
                            type: string
                            format: date-time
                          actionDate:
                            type: string
                            format: date-time
                            nullable: true
                            description: Date when the vendor accepted or declined the lead
                          category:
                            type: string
                            description: Trade category (e.g. "Plumbing", "Electrical")
                          customerName:
                            type: string
                          customerEmail:
                            type: string
                            format: email
                            nullable: true
                            description: Only included after lead is accepted
                          customerPhone:
                            type: string
                            nullable: true
                            description: Only included after lead is accepted
                          customerAddress:
                            type: string
                            nullable: true
                            description: Only included after lead is accepted
                          projectDetailsHtml:
                            type: string
                            description: HTML-formatted project details
                          originalJobDescription:
                            type: string
                          vendorNotificationViewed:
                            type: boolean
                            description: Whether the vendor has viewed this lead
                          vendorLeadAction:
                            type: string
                            enum:
                              - NONE
                              - ACCEPT
                              - DECLINE
                              - EXPIRED
                            description: Current action state of the lead
                          declineReason:
                            type: string
                            nullable: true
                            description: Reason provided when declining
                          postLeadStatus:
                            type: string
                            nullable: true
                            enum:
                              - NO_RESPONSE
                              - HOMEOWNER_CONTACTED
                              - MEETUP_SCHEDULED
                              - QUOTE_SENT
                              - JOB_PENDING_DECISION
                              - JOB_WON
                              - JOB_LOST
                              - JOB_POSTPONED_OR_CANCELLED
                              - NO_RESPONSE_FROM_HOMEOWNER
                              - OTHER
                              - REACHED_OUT_TO_HOMEOWNER
                              - MULTIPLE_ATTEMPTS_NO_RESPONSE
                              - CONTACT_MADE
                              - ESTIMATE_PROVIDED
                              - LEAD_WON
                              - LEAD_LOST
                            description: Current post-acceptance job tracking status
                          postLeadRequiresAction:
                            type: boolean
                            description: >-
                              Whether a status update is required from the
                              vendor
                      - type: object
                        properties:
                          customerInformationHtml:
                            type: string
                            nullable: true
                            description: >-
                              HTML-formatted customer information. Only included
                              after lead is accepted.
                          postLeadStatusData:
                            type: object
                            nullable: true
                            description: Post-acceptance job tracking data
                            properties:
                              status:
                                type: string
                                enum:
                                  - NO_RESPONSE
                                  - HOMEOWNER_CONTACTED
                                  - MEETUP_SCHEDULED
                                  - QUOTE_SENT
                                  - JOB_PENDING_DECISION
                                  - JOB_WON
                                  - JOB_LOST
                                  - JOB_POSTPONED_OR_CANCELLED
                                  - NO_RESPONSE_FROM_HOMEOWNER
                                  - OTHER
                                  - REACHED_OUT_TO_HOMEOWNER
                                  - MULTIPLE_ATTEMPTS_NO_RESPONSE
                                  - CONTACT_MADE
                                  - ESTIMATE_PROVIDED
                                  - LEAD_WON
                                  - LEAD_LOST
                              statusActionDate:
                                type: string
                                format: date-time
                                nullable: true
                              reason:
                                type: string
                                nullable: true
                                description: >-
                                  Notes/reason text. Required for JOB_LOST,
                                  JOB_POSTPONED_OR_CANCELLED, OTHER. Required
                                  for LEAD_LOST when lostReason is OTHER.
                                  Optional for all other statuses.
                              meetupScheduledDate:
                                type: string
                                format: date-time
                                nullable: true
                              jobAmount:
                                type: number
                                format: double
                                nullable: true
                                description: Project amount for JOB_WON or LEAD_WON status
                              requiresAction:
                                type: boolean
                              contactMethod:
                                type: string
                                nullable: true
                                enum:
                                  - PHONE_CALL
                                  - TEXT
                                  - EMAIL
                                  - IN_PERSON_MEETING
                                description: >-
                                  Contact method for REACHED_OUT_TO_HOMEOWNER or
                                  CONTACT_MADE statuses
                              estimateType:
                                type: string
                                nullable: true
                                enum:
                                  - IN_PERSON_ESTIMATE
                                  - EMAILED_ESTIMATE
                                  - VERBAL_ESTIMATE
                                  - PORTAL_ATTACHMENT_ESTIMATE
                                  - OTHER
                                description: Estimate type for ESTIMATE_PROVIDED status
                              lostReason:
                                type: string
                                nullable: true
                                enum:
                                  - PRICE
                                  - TIMING
                                  - OTHER
                                description: Required for LEAD_LOST status
                              estimatedProjectStartDate:
                                type: string
                                format: date-time
                                nullable: true
                                description: >-
                                  For LEAD_WON status. Null when startDateTbd is
                                  true.
                              estimatedCompletionDate:
                                type: string
                                format: date-time
                                nullable: true
                                description: >-
                                  For LEAD_WON status. Null when
                                  completionDateTbd is true.
                              startDateTbd:
                                type: boolean
                                description: >-
                                  Whether the project start date is TBD
                                  (LEAD_WON)
                              completionDateTbd:
                                type: boolean
                                description: Whether the completion date is TBD (LEAD_WON)
                          attachments:
                            type: array
                            items:
                              type: object
                              description: File attachment metadata
                              properties:
                                id:
                                  type: integer
                                  format: int64
                                displayFilename:
                                  type: string
                                contentType:
                                  type: string
                                  description: >-
                                    MIME type (application/pdf, image/jpeg,
                                    image/png)
                                uploadDate:
                                  type: string
                                  format: date-time
        '400':
          description: >-
            Lead not accepted, status locked (JOB_WON/LEAD_WON), or missing
            required fields
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
        '404':
          description: Lead not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
        '429':
          description: Rate limit exceeded (250 requests per 5 minutes)
          headers:
            Retry-After:
              schema:
                type: integer
                example: 300
              description: Seconds to wait before retrying
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
              example:
                success: false
                error: >-
                  Rate limit exceeded. Maximum 250 requests per 5 minutes.
                  Please retry later.
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT token issued from the RenovationFind Manager Portal

````