Search Maryland Trademark Registry

Site sos.maryland.govTask search-maryland-trademark-registryVersion v3Updated Jul 30, 2026Category government-records

Search the Maryland Secretary of State trademark registry and capture the submitted query and visible result area without interacting with CAPTCHA. This skill was captured from a live agent session on sos.maryland.gov 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

Search the official Maryland Secretary of State trademark registry for a supplied query and capture the submitted query plus the live result area. Do not solve, submit, or interact with CAPTCHA challenges.

When to Use

Use for any Maryland trademark-registry lookup where the caller provides a name, phrase, or other search text and needs the visible post-submission results.

Workflow

  1. Navigate directly to https://sos.maryland.gov/Pages/Trademarks/TMSearch.aspx.
  2. In the same browser operation, set input#ctl00_PlaceHolderMain_keyword to {query}, activate input#ctl00_PlaceHolderMain_searchSubmit, wait for the page's post-submit update, and run this evaluator on the resulting page:
(() => {
  const visible = (el) => {
    if (!el) return false;
    const s = getComputedStyle(el),
      r = el.getBoundingClientRect();
    return (
      s.display !== "none" &&
      s.visibility !== "hidden" &&
      r.width > 0 &&
      r.height > 0
    );
  };
  const input = document.querySelector("#ctl00_PlaceHolderMain_keyword");
  const candidates = [
    ...document.querySelectorAll(
      '[aria-live], [role="region"], table, #ctl00_PlaceHolderMain',
    ),
  ].filter(visible);
  const live =
    candidates.find((el) => el.matches("[aria-live]")) ||
    candidates.find((el) => el.matches("table")) ||
    candidates.find((el) => el.id === "ctl00_PlaceHolderMain") ||
    document.querySelector("main");
  return {
    submittedQuery: input ? input.value : null,
    resultAreaText: live ? live.innerText.trim() : "",
    resultAreaHtml: live ? live.outerHTML : "",
  };
})();

The evaluator reads only the loaded registry page; if a CAPTCHA appears, stop without solving it and report the visible challenge state instead of attempting further interaction.

Site-Specific Gotchas

  • This is an ASP.NET page whose search controls use the opaque IDs ctl00_PlaceHolderMain_keyword and ctl00_PlaceHolderMain_searchSubmit.
  • The observed search URL has no query parameter for the keyword, so direct URL construction alone does not submit a search; populate the control and activate the submit input.
  • The result markup may be a table or an ASP.NET content region rather than a consistently named results container; the extractor checks live regions, tables, and #ctl00_PlaceHolderMain in that order.
  • Never solve or interact with CAPTCHA; capture only the query and whatever result or challenge area is visibly returned.

Expected Output

Return an object with submittedQuery, resultAreaText, and resultAreaHtml. The query is the value actually present in the keyword field after submission, and the result-area fields contain the visible post-submit registry content or CAPTCHA state.

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=sos.maryland.gov&task=search-maryland-trademark-registry