POST
/
api
/
dealers
Submit a Dealer
curl --request POST \
  --url https://monitoring.safeturf.ai/api/dealers \
  --header 'Authorization: Basic <encoded-value>' \
  --header 'Content-Type: multipart/form-data' \
  --form 'dealer={
  "dealerId": "<string>",
  "legalName": "<string>",
  "dba": "<string>",
  "ein": "<string>",
  "entityType": "<string>",
  "stateOfIncorporation": "<string>",
  "phone": "<string>",
  "email": "<string>",
  "website": "<string>",
  "address": "<string>",
  "unit": "<string>",
  "city": "<string>",
  "state": "<string>",
  "zip": "<string>",
  "annualSalesRevenue": 123,
  "annualFinanceRevenue": 123,
  "averageTicketSize": 123,
  "owners": [
    {
      "firstName": "<string>",
      "lastName": "<string>",
      "ownershipPercent": 123,
      "isPrimary": true,
      "email": "<string>",
      "phone": "<string>",
      "dateOfBirth": "<string>",
      "ssn": "<string>",
      "address": "<string>",
      "city": "<string>",
      "state": "<string>",
      "zip": "<string>"
    }
  ],
  "locations": [
    {
      "name": "<string>",
      "address": "<string>",
      "unit": "<string>",
      "city": "<string>",
      "state": "<string>",
      "zip": "<string>",
      "phone": "<string>",
      "email": "<string>",
      "isPrimary": true
    }
  ],
  "licenses": [
    {
      "licenseNumber": "<string>",
      "states": [
        "<string>"
      ],
      "expirationDate": "<string>",
      "trade": "<string>"
    }
  ],
  "bankAccounts": [
    {
      "bankName": "<string>",
      "routingNumber": "<string>",
      "accountNumber": "<string>",
      "accountType": "<string>",
      "accountHolder": "<string>"
    }
  ]
}' \
  --form w9='@example-file' \
  --form certificate_of_insurance='@example-file' \
  --form home_improvement_contract='@example-file' \
  --form trade_license='@example-file' \
  --form voided_check='@example-file' \
  --form business_registration='@example-file' \
  --form any_other_name='@example-file'
{
  "status": "<string>",
  "documents": [
    {}
  ],
  "warnings": [
    {}
  ]
}
This endpoint requires HTTP Basic authentication. Use your client_id as the username and client_secret as the password. Contact your Safeturf integration contact to get your client credentials.
Submits one dealer for underwriting: the business, every owner with 20% or more, its locations, licences and funding account, together with its documents. Everything is checked before anything is saved. If something is wrong, the response lists every problem and nothing is created. On 202 the dealer and its documents are in underwriting: automated verification starts within a minute and an underwriter reviews the result. Follow the dealer with Get Dealer Status. Add files the underwriter asks for later with Add a Document. Documents are stored privately by Safeturf and are only visible to the underwriting team.

Request

Send multipart/form-data with:
  • a dealer part holding the dealer as JSON (fields below), and
  • one file part per document. The part name is the document type.
A dealer with no documents can also be sent as plain application/json, with the dealer object as the whole body.
dealer
object
required
The dealer, as JSON. Field names are case-sensitive; unknown fields are rejected.
w9
file
W-9.
certificate_of_insurance
file
Certificate of insurance.
home_improvement_contract
file
Home improvement contract or sample invoice.
trade_license
file
Trade or contractor licence.
voided_check
file
Voided check.
business_registration
file
Business registration.
any_other_name
file
Any other document. Use a lowercase name of letters, digits and underscores, e.g. workers_comp_certificate, or other. It is filed under that name for the underwriter.
Files must be PDF, JPEG or PNG, up to 15 MB each and 50 MB per request. Send larger sets in parts: the rest with Add a Document.

Example

curl -X POST "https://monitoring.safeturf.ai/api/dealers" \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -F 'dealer=@dealer.json;type=application/json' \
  -F 'w9=@w9.pdf' \
  -F 'certificate_of_insurance=@coi.pdf'
dealer.json:
{
  "dealerId": "360-0042",
  "legalName": "Acme Roofing LLC",
  "dba": "Acme Roofing",
  "ein": "12-3456789",
  "entityType": "LLC",
  "stateOfIncorporation": "TX",
  "phone": "(512) 555-0142",
  "email": "office@acmeroofing.example",
  "address": "1200 Congress Ave",
  "city": "Austin",
  "state": "TX",
  "zip": "78701",
  "annualSalesRevenue": 2500000,
  "owners": [
    {
      "firstName": "Dana",
      "lastName": "Rivera",
      "ownershipPercent": 100,
      "isPrimary": true,
      "email": "dana@acmeroofing.example",
      "phone": "(512) 555-0199",
      "dateOfBirth": "1980-04-12",
      "ssn": "123-45-6789",
      "address": "88 Lamar Blvd",
      "city": "Austin",
      "state": "TX",
      "zip": "78704"
    }
  ],
  "licenses": [
    { "licenseNumber": "TACLA12345C", "states": ["TX"], "expirationDate": "2027-06-30", "trade": "Roofing" }
  ],
  "bankAccounts": [
    { "bankName": "Frost Bank", "routingNumber": "114000093", "accountNumber": "000123456789", "accountType": "Checking" }
  ]
}

Responses

202 Accepted

{
  "dealerId": "360-0042",
  "status": "received",
  "program": "360Finance",
  "documents": [
    { "documentType": "w9", "filename": "w9.pdf" },
    { "documentType": "certificate_of_insurance", "filename": "coi.pdf" }
  ],
  "warnings": []
}
status
string
Always received. Follow progress with Get Dealer Status.
documents
object[]
The documents filed with the dealer.
warnings
object[]
Things worth knowing that do not block the submission, e.g. no bank account yet. Same shape as errors.

422 Fix and resend

Nothing was saved. Every problem is listed, each with the JSON path of the field (or documents.<name> for a file).
{
  "dealerId": "360-0042",
  "errors": [
    { "field": "ein", "message": "EIN must be 9 digits.", "level": "error" },
    { "field": "owners[0].ssn", "message": "SSN must be 9 digits.", "level": "error" },
    { "field": "documents.w9", "message": "w9.docx is not a PDF, JPEG or PNG.", "level": "error" }
  ],
  "warnings": []
}

Other responses

StatusMeaning
400dealerId has characters other than letters, digits, ., _, -.
401Missing or wrong client credentials.
409This dealerId was already submitted with different content. Use Add a Document for more files.
413The request is over 50 MB.
503Underwriting could not start. Send the same request again in a minute; it picks up where it stopped.
Retries are safe. Sending exactly the same request again returns 202 and never creates a second dealer or case. That covers network timeouts too.