Get full solicitation details

Site bidnetdirect.comTask get-solicitation-detailVersion v3Updated Aug 11, 2026Category procurement

Resolve a California public-procurement event and open its BidNet Direct solicitation page to extract complete solicitation details and available documents. This skill was captured from a live agent session on bidnetdirect.com and publishes here verbatim, exactly as an agent receives it.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

Purpose

Retrieve the complete visible solicitation detail for a named California procurement event on BidNet Direct, including metadata, description, dates, contact information, classifications, documents, and related links.

When to Use

Use when the caller provides a solicitation or project name but not the opaque BidNet solicitation ID. This recipe applies to California solicitations that originate in the Cal eProcure event system and link through to BidNet Direct.

Workflow

  1. Resolve the source event ID instead of guessing a BidNet ID:
    • Open https://caleprocure.ca.gov/pages/Events-BS3/event-search.aspx.
    • Search for {solicitation-name} and select the result whose title and issuing agency match the requested event.
    • Read the numeric EventID from the result or its event-details link; event-detail URLs use https://caleprocure.ca.gov/pages/Events-BS3/event-details.aspx?EventID={event-id}.
    • If a direct Cal eProcure event URL is already available, it may use the shorter form https://caleprocure.ca.gov/event/{agency-code}/{event-number}. Navigate directly to that URL and verify the displayed title and agency before continuing.
  2. Open the resolved Cal eProcure event detail and follow its BidNet Direct solicitation link. Preserve the complete BidNet URL; BidNet uses an opaque numeric solicitation ID in a path like /california/solicitations/open-bids/statewide/{title-slug}/{solicitation-id}?origin=0&target=view. Do not invent {solicitation-id} or infer it from the title.
  3. If BidNet redirects to https://www.bidnetdirect.com/public/authentication/login or the SAML handoff https://www.bidnetdirect.com/saml/login, an authenticated BidNet session is required before full solicitation details or protected documents can be viewed. Complete authentication using the caller's approved vault mechanism, then return to the preserved solicitation URL; never put credentials or tokens in the URL or recipe.
  4. On the loaded BidNet page, run this single-page extractor in evaluate() and return its object:
(() => {
  const root =
    document.querySelector('main, [role="main"], article') || document.body;
  const visible = (el) => {
    const s = getComputedStyle(el);
    return (
      s.display !== "none" &&
      s.visibility !== "hidden" &&
      !!(el.textContent || "").trim()
    );
  };
  const clean = (s) =>
    (s || "")
      .replace(/\u00a0/g, " ")
      .replace(/[ \t]+/g, " ")
      .replace(/\n[ \t]+/g, "\n")
      .trim();
  const text = (el) => clean(el.innerText || el.textContent || "");
  const fields = {};
  root.querySelectorAll("dt").forEach((dt) => {
    const dd = dt.nextElementSibling;
    if (dd && dd.tagName === "DD") fields[clean(dt.innerText)] = text(dd);
  });
  root.querySelectorAll("tr").forEach((tr) => {
    const cells = [...tr.querySelectorAll("th,td")].map(text).filter(Boolean);
    if (cells.length === 2 && cells[0] && !fields[cells[0]])
      fields[cells[0]] = cells[1];
  });
  const tables = [...root.querySelectorAll("table")]
    .filter(visible)
    .map((table) => ({
      caption: text(table.querySelector("caption")),
      rows: [...table.querySelectorAll("tr")]
        .map((tr) => [...tr.querySelectorAll("th,td")].map(text).filter(Boolean))
        .filter((r) => r.length),
    }));
  const headings = [...root.querySelectorAll('h1,h2,h3,h4,h5,[role="heading"]')]
    .filter(visible)
    .map(text)
    .filter(Boolean);
  const links = [...root.querySelectorAll("a[href]")]
    .filter(visible)
    .map((a) => ({ text: text(a), href: a.href }))
    .filter((x) => x.text || x.href);
  return {
    url: location.href,
    title: text(root.querySelector("h1")) || document.title,
    headings: [...new Set(headings)],
    fields,
    tables,
    links,
    fullText: text(root),
  };
})();
  1. Treat visible document links in the returned links array as the document inventory. If documents are instead exposed on the source Cal eProcure event page, click the page's attachment/download control, then inspect the attachment modal and its visible filename/link before downloading; the observed controls are #RESP_INQ_DL0_WK_AUC_DOWNLOAD_PB, followed by buttons named PV_ATTACH_WRK_SCM_DOWNLOAD$0, $1, and so on. These controls are optional and should be used only when the BidNet page does not expose the documents.

Site-Specific Gotchas

  • The requested project name alone is insufficient to construct the BidNet URL: the final path contains an opaque numeric solicitation ID. Resolve the matching Cal eProcure event first and follow its BidNet link.
  • Cal eProcure event details use the EventID query parameter and may display an error page if the event ID is wrong or incomplete. Direct event URLs may also appear as /event/{agency-code}/{event-number}; verify the title and agency rather than assuming the path identifies the requested event.
  • Preserve the BidNet query parameters origin=0&target=view when following the discovered solicitation URL; they select the solicitation view reached by the source-event link.
  • BidNet may redirect unauthenticated users first to /public/authentication/login and then to /saml/login; protected solicitation details and documents require an authenticated session. Use the approved vault credential flow and return to the preserved solicitation URL after authentication.
  • Cal eProcure attachment downloads are modal-driven: selecting an attachment opens #attachmentWrapperModal and exposes a temporary #downloadButton. Close the modal before selecting the next attachment, and do not assume attachment index $0 is the desired document.
  • BidNet pages can contain mixed metadata tables, document/link cards, and prose sections. Use the extractor's fields, tables, links, and fullText together rather than assuming every detail is in one card.
  • The DOM selectors above are semantic fallbacks (main, headings, definition lists, tables, and links); if BidNet changes its markup, verify that the selected root still represents the solicitation rather than site-wide navigation.

Expected Output

Return the extractor object for the matching BidNet solicitation, with the canonical URL, solicitation title, normalized label/value fields, all visible detail tables, document and related links, section headings, and the complete visible solicitation text. Include any source-page attachment filenames and links when documents are available only through the Cal eProcure attachment modal.

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=bidnetdirect.com&task=get-solicitation-detail