Live Direct Marketing Site Enrichment API

The Site Enrichment API from Live Direct Marketing — 17 operation(s) for site enrichment.

Operations 19

Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay

POST /api/site-enrichment/detect-forms Detect contact forms in page HTML · #968 detect forms on a page from HTML: hasForm — whether any form is present at… #
Ask an LLM
“Can I check whether a web page has a contact-us form from its HTML?”
“Does form detection ignore search, login and newsletter forms?”
Tell an agent
Detect forms in this HTML: {html}.
Check whether page {url} has a contact form, using its HTML {html}.
POST /api/site-enrichment/tasks Start a website crawl to enrich companies · #903/#889 enqueue the canonical site-crawl task (durable, DB is the source of… #
Ask an LLM
“How do I crawl my companies' websites to collect contact details?”
“Can I limit a site crawl to one company list and cap how many sites it visits?”
Tell an agent
Crawl the websites of companies in list {list}, up to {limit} sites.
Enqueue a site crawl for companies {companies} and save screenshots.
GET /api/site-enrichment/tasks List site-crawl tasks · #953 list of site-crawl tasks: both linked to a scoring task (scoringTaskId)… #
Ask an LLM
“Which website crawl tasks have I run, and which are still going?”
“Can I list crawls that were launched without a scoring task?”
Tell an agent
List site-crawl tasks with status {status} for scoring task {scoring}, owned={owned}, page {page} of {size}.
Show my {status} site-enrichment crawls, page {page}, {size} per page, scoring task {scoring}, owned {owned}.
GET /api/site-enrichment/tasks/preview Preview a list's crawl coverage · #955 preview list coverage WITHOUT starting a crawl: how many cards are in the… #
Ask an LLM
“Before crawling, how many companies in my list actually have a website filled in?”
“Can I see unique domain counts for a list without starting a crawl?”
Tell an agent
Preview crawl coverage of list {list} using domain field {field}.
Count unique domains in list {list} field {field} without starting a crawl.
GET /api/site-enrichment/tasks/{id} Get a site-crawl task's status · Status/counters of a site-crawl task #
Ask an LLM
“Is my website crawl finished yet?”
“Where do I see the progress counters of one crawl task?”
Tell an agent
Show the status of site-crawl task {id}.
Report how far along crawl {id} is.
GET /api/site-enrichment/tasks/{id}/events Read a crawl task's event log · #903 task transition log, read from the DB, cursor=last received seq #
Ask an LLM
“Can I follow the state transitions of a crawl task as they happen?”
“How do I fetch only the crawl journal events newer than the last one I saw?”
Tell an agent
Show the event log for crawl task {id} after sequence {cursor}.
Get new journal entries of crawl {id} since cursor {cursor}.
POST /api/site-enrichment/tasks/{id}/events Add an agent note to a crawl journal · #1144 atom B: an agent note into the task journal (kind=agent_note, author… #
Ask an LLM
“Can an agent leave a note in a crawl task's journal?”
“Who is recorded as the author when I post a note to a crawl task?”
Tell an agent
Add the note {text} to crawl task {id}'s journal.
Log agent note {text} on site-crawl {id}.
GET /api/site-enrichment/tasks/{id}/reason-summary Summarize why crawl sites failed · #949 summary of failure reasons (for a clickable filter above the journal) #
Ask an LLM
“Why did sites fail in my crawl task, grouped by reason?”
“What are the most common failure reasons in a website crawl?”
Tell an agent
Summarize failure reasons for crawl task {id}.
Group the failed sites in crawl {id} by reason.
GET /api/site-enrichment/tasks/{id}/stats Get a crawl task's funnel and results · #957/#969 unified task statistics read from durable rows: funnel (cards AND… #
Ask an LLM
“How many emails and phones did my website crawl collect?”
“Can I see a crawl's funnel with companies and domains counted separately?”
Tell an agent
Show the unified statistics for crawl task {id}.
Give me the funnel and collected-data counts of crawl {id}.
GET /api/site-enrichment/tasks/{id}/items List a crawl task's per-site results · #952/#969 crawl task items: paginated, with a filter by outcome… #
Ask an LLM
“Which sites in my crawl were down, empty or behind a captcha?”
“Can I filter crawl results by outcome or reason code?”
Tell an agent
List items of crawl {id} with outcome {status} and reason {reason}, page {page} of {size}.
Show {status} sites in crawl task {id} for reason code {reason}, page {page}, {size} per page.
GET /api/site-enrichment/tasks/{id}/raw Get raw crawled page text for a company · #965 diagnostic snapshot of the RAW visited page text(s) for ONE company… #
Ask an LLM
“Can I see the raw page text a crawl captured for one company before extraction?”
“Why might the raw crawl snapshot for a company come back empty?”
Tell an agent
Show the raw visited page text for company {company} in crawl {id}.
Get the diagnostic snapshot of company {company}'s homepage from crawl task {id}.
POST /api/site-enrichment/tasks/{id}/cancel Cancel a site-crawl task · Cancel a site-crawl task (durable — status in the DB, visible to any process) #
Ask an LLM
“How do I stop a website crawl for good?”
“Can a cancelled crawl be retried later?”
Tell an agent destructive · confirm first
Cancel site-crawl task {id}.
Stop crawl {id} permanently.
POST /api/site-enrichment/tasks/{id}/pause Pause a site-crawl task · #952 pause a crawl task (durable, non-terminal — resumed via .../resume) #
Ask an LLM
“Can I pause a website crawl and pick it up later?”
“Does pausing a crawl end it?”
Tell an agent
Pause crawl task {id}.
Put site crawl {id} on hold.
POST /api/site-enrichment/tasks/{id}/resume Resume a paused site crawl · #952 resume a paused crawl task #
Ask an LLM
“How do I continue a crawl I paused earlier?”
“Will resuming a crawl pick up where it stopped?”
Tell an agent
Resume crawl task {id}.
Restart paused site crawl {id}.
POST /api/site-enrichment/tasks/{id}/retry Retry failed companies in a finished crawl · Retry still-not-OK companies of a terminal task (FAILED/PARTIAL/CANCELLED) #
Ask an LLM
“Can I re-crawl only the companies that failed in a finished task?”
“Which crawl statuses allow a retry of not-OK companies?”
Tell an agent
Retry the failed companies in crawl task {id}.
Re-run the not-OK sites of finished crawl {id}.
GET /api/site-enrichment/backlog/stale-http-status Count cards missing a crawl HTTP code · #969 backfill: count and ids of tenant cards where… #
Ask an LLM
“How many companies are marked site OK but have no real HTTP status recorded?”
“Can I list company cards whose site check needs backfilling?”
Tell an agent
Count cards marked site OK without an HTTP code, returning up to {limit} ids.
Show up to {limit} companies in the stale site-status backlog.
POST /api/site-enrichment/backlog/stale-http-status/requeue Re-crawl the stale site-status backlog · #969 backfill: a controlled BATCH re-crawl of flagged cards (batchSize… #
Ask an LLM
“Can I re-crawl the companies that are missing a recorded HTTP status in batches?”
“What's the maximum batch size for re-crawling the stale OK backlog?”
Tell an agent
Re-crawl {size} cards from the stale HTTP-status backlog.
Requeue a batch of {size} site-OK cards lacking an HTTP code.
GET /api/site-enrichment/backlog/down-wait-timeout Count sites down from our own timeouts · #1126: count and ids of tenant cards where customFields.site_status='down' AND… #
Ask an LLM
“How many companies were marked site down because of a crawler timeout rather than the site itself?”
“Can I list cards in the down wait-timeout backlog?”
Tell an agent
Count cards marked down from a wait timeout, up to {limit} ids.
Show up to {limit} companies in the down-wait-timeout backlog.
POST /api/site-enrichment/backlog/down-wait-timeout/requeue Re-crawl sites marked down by timeouts · #1126: a controlled BATCH re-crawl of cards from backlog/down-wait-timeout… #
Ask an LLM
“Can I re-crawl the sites that were wrongly marked down by a crawler timeout?”
“How many down-backlog cards can I requeue in one batch?”
Tell an agent
Re-crawl {size} cards from the down wait-timeout backlog.
Requeue a batch of {size} timed-out down sites.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/live-direct-marketing-online:live-direct-marketing-online-site-enrichment-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

live-direct-marketing-online-site-enrichment-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: LDM v3 Site Enrichment API
  description: 'Multi-tenant B2B outreach automation platform. Auth: JWT Bearer (15-min) or tenant API key (ldm_*) managed in CRM Settings → API Keys. All tenant-scoped endpoints require the X-Tenant-Id header.'
  version: 1.0.0
  contact: {}
servers:
- url: https://api.live-direct-marketing.online
  description: Production
- url: https://api.dev.live-direct-marketing.online
  description: Development
- url: http://127.0.0.1:3000
  description: Local
tags:
- name: Site Enrichment
paths:
  /api/site-enrichment/detect-forms:
    post:
      operationId: SiteEnrichmentController_detectFormsRoute
      parameters:
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DetectFormsDto'
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: '#968 detect forms on a page from HTML: hasForm — whether any form is present at…'
      tags:
      - Site Enrichment
      x-required-scope:
      - site-enrichment:read
  /api/site-enrichment/tasks:
    post:
      operationId: SiteEnrichmentController_create
      parameters:
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSiteEnrichmentTaskDto'
      responses:
        '202':
          description: ''
      security:
      - jwt: []
      summary: '#903/#889 enqueue the canonical site-crawl task (durable, DB is the source of…'
      tags:
      - Site Enrichment
      x-required-scope:
      - site-enrichment:write
    get:
      operationId: SiteEnrichmentController_findAll
      parameters:
      - name: page
        required: true
        in: query
        schema:
          type: string
      - name: pageSize
        required: true
        in: query
        schema:
          type: string
      - name: status
        required: true
        in: query
        schema:
          type: string
      - name: scoringTaskId
        required: true
        in: query
        schema:
          type: string
      - name: owned
        required: true
        in: query
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: '#953 list of site-crawl tasks: both linked to a scoring task (scoringTaskId)…'
      tags:
      - Site Enrichment
      x-required-scope:
      - site-enrichment:read
  /api/site-enrichment/tasks/preview:
    get:
      operationId: SiteEnrichmentController_preview
      parameters:
      - name: listId
        required: true
        in: query
        schema:
          type: string
      - name: domainField
        required: true
        in: query
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: '#955 preview list coverage WITHOUT starting a crawl: how many cards are in the…'
      tags:
      - Site Enrichment
      x-required-scope:
      - site-enrichment:read
  /api/site-enrichment/tasks/{id}:
    get:
      operationId: SiteEnrichmentController_findOne
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: Status/counters of a site-crawl task
      tags:
      - Site Enrichment
  /api/site-enrichment/tasks/{id}/events:
    get:
      operationId: SiteEnrichmentController_listEvents
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: cursor
        required: true
        in: query
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: '#903 task transition log, read from the DB, cursor=last received seq'
      tags:
      - Site Enrichment
    post:
      operationId: SiteEnrichmentController_addAgentNote
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAgentNoteDto'
      responses:
        '201':
          description: ''
      security:
      - jwt: []
      summary: '#1144 atom B: an agent note into the task journal (kind=agent_note, author…'
      tags:
      - Site Enrichment
  /api/site-enrichment/tasks/{id}/reason-summary:
    get:
      operationId: SiteEnrichmentController_reasonSummary
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: '#949 summary of failure reasons (for a clickable filter above the journal)'
      tags:
      - Site Enrichment
  /api/site-enrichment/tasks/{id}/stats:
    get:
      operationId: SiteEnrichmentController_stats
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: '#957/#969 unified task statistics read from durable rows: funnel (cards AND…'
      tags:
      - Site Enrichment
  /api/site-enrichment/tasks/{id}/items:
    get:
      operationId: SiteEnrichmentController_listItems
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: status
        required: true
        in: query
        schema:
          type: string
      - name: reasonCode
        required: true
        in: query
        schema:
          type: string
      - name: page
        required: true
        in: query
        schema:
          type: string
      - name: pageSize
        required: true
        in: query
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: '#952/#969 crawl task items: paginated, with a filter by outcome…'
      tags:
      - Site Enrichment
  /api/site-enrichment/tasks/{id}/raw:
    get:
      operationId: SiteEnrichmentController_rawFetch
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: companyId
        required: true
        in: query
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: '#965 diagnostic snapshot of the RAW visited page text(s) for ONE company…'
      tags:
      - Site Enrichment
  /api/site-enrichment/tasks/{id}/cancel:
    post:
      operationId: SiteEnrichmentController_cancel
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '201':
          description: ''
      security:
      - jwt: []
      summary: Cancel a site-crawl task (durable — status in the DB, visible to any process)
      tags:
      - Site Enrichment
  /api/site-enrichment/tasks/{id}/pause:
    post:
      operationId: SiteEnrichmentController_pause
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '201':
          description: ''
      security:
      - jwt: []
      summary: '#952 pause a crawl task (durable, non-terminal — resumed via .../resume)'
      tags:
      - Site Enrichment
  /api/site-enrichment/tasks/{id}/resume:
    post:
      operationId: SiteEnrichmentController_resume
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '201':
          description: ''
      security:
      - jwt: []
      summary: '#952 resume a paused crawl task'
      tags:
      - Site Enrichment
  /api/site-enrichment/tasks/{id}/retry:
    post:
      operationId: SiteEnrichmentController_retry
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '201':
          description: ''
      security:
      - jwt: []
      summary: Retry still-not-OK companies of a terminal task (FAILED/PARTIAL/CANCELLED)
      tags:
      - Site Enrichment
  /api/site-enrichment/backlog/stale-http-status:
    get:
      operationId: SiteEnrichmentController_staleOkBacklog
      parameters:
      - name: limit
        required: true
        in: query
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: '#969 backfill: count and ids of tenant cards where…'
      tags:
      - Site Enrichment
      x-required-scope:
      - site-enrichment:read
  /api/site-enrichment/backlog/stale-http-status/requeue:
    post:
      operationId: SiteEnrichmentController_requeueStaleOkBacklog
      parameters:
      - name: batchSize
        required: true
        in: query
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '201':
          description: ''
      security:
      - jwt: []
      summary: '#969 backfill: a controlled BATCH re-crawl of flagged cards (batchSize…'
      tags:
      - Site Enrichment
      x-required-scope:
      - site-enrichment:write
  /api/site-enrichment/backlog/down-wait-timeout:
    get:
      operationId: SiteEnrichmentController_downBacklog
      parameters:
      - name: limit
        required: true
        in: query
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '200':
          description: ''
      security:
      - jwt: []
      summary: '#1126: count and ids of tenant cards where customFields.site_status=''down'' AND…'
      tags:
      - Site Enrichment
      x-required-scope:
      - site-enrichment:read
  /api/site-enrichment/backlog/down-wait-timeout/requeue:
    post:
      operationId: SiteEnrichmentController_requeueDownBacklog
      parameters:
      - name: batchSize
        required: true
        in: query
        schema:
          type: string
      - name: X-Tenant-Id
        in: header
        required: false
        schema:
          type: string
          format: uuid
        description: Tenant UUID — required for all tenant-scoped endpoints
      responses:
        '201':
          description: ''
      security:
      - jwt: []
      summary: '#1126: a controlled BATCH re-crawl of cards from backlog/down-wait-timeout…'
      tags:
      - Site Enrichment
      x-required-scope:
      - site-enrichment:write
components:
  schemas:
    CreateAgentNoteDto:
      type: object
      properties:
        text:
          type: string
          maxLength: 4000
      required:
      - text
    CreateSiteEnrichmentTaskDto:
      type: object
      properties:
        companyIds:
          minItems: 1
          maxItems: 500
          type: array
          items:
            type: string
        listId:
          type: string
          maxLength: 100
        domainField:
          type: string
          maxLength: 150
        limit:
          type: number
          minimum: 1
          maximum: 500
        timeoutMs:
          type: number
          minimum: 1000
          maximum: 120000
        maxAttempts:
          type: number
          minimum: 1
          maximum: 5
        saveScreenshot:
          type: boolean
        loadImages:
          type: boolean
        pageConcurrency:
          type: number
          minimum: 1
          maximum: 4
        visitPages:
          type: object
        scoringTaskId:
          type: string
          maxLength: 100
    DetectFormsDto:
      type: object
      properties:
        html:
          type: string
        pageUrl:
          type: string
          maxLength: 2000
      required:
      - html
  securitySchemes:
    jwt:
      scheme: bearer
      bearerFormat: JWT
      type: http
      description: JWT access token from /auth/login (Bearer <token>)
    tenant-api-key:
      scheme: bearer
      bearerFormat: JWT
      type: http
      description: Tenant API key (Bearer ldm_*) for MCP/A2A clients. Issued via CRM Settings → API Keys.
    rpa-service:
      scheme: bearer
      bearerFormat: JWT
      type: http
      description: Dedicated RPA service key. No tenant API-key or query-key authentication.