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 is published here as a reusable recipe for agents.

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.

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.

Use Cases

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.

Automation Flow

  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.

Possible Friction Points

  • 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.

Call it

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