Skip to main content
POST
/
lead
Submit lead
curl --request POST \
  --url https://{tenant}.techea.eu/api/v1/lead \
  --header 'Content-Type: application/json' \
  --header 'apikey: <api-key>' \
  --data '
{
  "product_id": "36068625-4707-4ef8-a419-2aad1483db49",
  "publisher_id": "b96bdbc6-437a-4e2f-9b0e-2d91a5767f3b",
  "customer": {
    "external_id": "pub-12345-abc",
    "personal_data": {
      "first_name": "John",
      "last_name": "Smith",
      "second_surname": "Johnson",
      "birthday": "1988-05-10",
      "identification_number": "12345678A",
      "nacionality": "ES",
      "gender": "male"
    },
    "contact": {
      "email": {
        "address": "john.smith@email.com",
        "status": "verified",
        "verified_at": "2026-02-01T10:00:00Z",
        "verification_method": "otp"
      },
      "phone": {
        "area_code": "+34",
        "number": "600111222",
        "status": "verified",
        "verified_at": "2026-02-01T10:00:00Z",
        "verification_method": "otp"
      }
    },
    "address": {
      "street": "Calle Mayor",
      "house": "1",
      "city": "Madrid",
      "region": "Madrid",
      "postal_code": "28001",
      "country": "ES"
    },
    "profile": {
      "occupation": "self_employed",
      "monthly_income": 2500,
      "monthly_expenses": 1500,
      "marital_status": "married",
      "children": 1,
      "education": "university_degree",
      "housing_tenure": "rental",
      "housing_type": "apartment",
      "company_sector": "technology_telecommunications"
    },
    "financial_instruments": [
      {
        "type": "bank_account",
        "currency": "EUR",
        "iban": "ES9121000418450200051332",
        "status": "not_verified"
      }
    ]
  },
  "product_data": {
    "loan_amount": 10000,
    "loan_purpose": "home_improvement",
    "loan_term_months": 36
  },
  "consents": {
    "entries": [
      {
        "type": "terms",
        "accepted": true,
        "accepted_at": "2026-02-16T10:22:31Z",
        "version": "v3.2",
        "document_url": "https://publisher.com/legal/terms/v3.2"
      },
      {
        "type": "privacy_policy",
        "accepted": true,
        "accepted_at": "2026-02-16T10:22:31Z",
        "version": "v4.1",
        "document_url": "https://publisher.com/legal/privacy/v4.1"
      },
      {
        "type": "marketing",
        "accepted": false,
        "accepted_at": null,
        "version": "v2.0"
      }
    ],
    "metadata": {
      "ip_address": "84.23.12.55",
      "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
      "collected_at": "2026-02-16T10:22:31Z"
    }
  },
  "tracking": {
    "click_id": "abc123xyz",
    "sub_id": "publisher_sub_1",
    "campaign_id": "camp_789",
    "source": "https://www.example.com"
  }
}
'
{
  "lead_id": "a1b2c3d4-0000-0000-0000-111122223333",
  "status": "new"
}

Authorizations

apikey
string
header
required

API Key provided by TECHEA

Body

application/json
product_id
string<uuid>
required

ID of the product the customer is applying for. Provided by TECHEA.

publisher_id
string<uuid>
required

Your publisher ID in TECHEA.

customer
object
required
product_data
object
required
consents
object
required
tracking
object

Optional campaign attribution data

Response

Lead received and processed. Check the status field:

  • new: lead accepted — no advertiser match yet, do not redirect
  • distributed: lead distributed to at least one advertiser — redirect customer to redirect_url
  • rejected: lead not accepted — check rejection_reason
lead_id
string<uuid> | null

ID generated by TECHEA. Used for advertiser event tracking. Null if the lead was rejected before being created (e.g. customer_already_exists).

status
enum<string>

Lead status from the publisher's perspective:

  • new: lead accepted — no advertiser match yet, do not redirect
  • distributed: lead sent to at least one advertiser — redirect customer to redirect_url
  • rejected: not accepted — check rejection_reason
Available options:
new,
distributed,
rejected
redirect_url
string<uri> | null

URL to redirect the customer to complete the process. Only present when status = distributed.

rejection_reason
enum<string> | null

Reason for rejection. Only present when status = rejected.

Available options:
customer_already_exists,
duplicate_submission,
eligibility_failed,
age_restriction,
income_insufficient,
geographic_restriction,
consents_missing,
invalid_product,
blacklisted,
fraud_suspected,
null