Skip to main content
MoltSets is an identity resolution API. You give it a piece of data — an email address, LinkedIn URL, IP address, or a person’s name and company — and it returns enriched contact and company information, including hashed emails (HEMs) for ad audiences. Every tool follows the same request and response structure, so once you’ve made one call, you know how to make all of them.

Base URL

All API requests go to:
Each tool has its own endpoint path. For example:

How a request works

Every request is a POST with a JSON body, an Authorization header, a Content-Type header, and a User-Agent header:
User-Agent can be any non-empty value — MoltSets doesn’t validate its contents, only that it’s present. Requests without one are rejected with a 403 (forbidden). See Errors.

How a response works

Every call that completes returns HTTP 200 with a consistent envelope:
  • results — the data returned by the tool. Empty, or with its fields set to null, when no data is found.
  • status — "ok" when the tool found data, "not_found" when it completed but matched nothing.
  • metadata.fair_use — your remaining record headroom in the 5-hour and 1-week windows, and when each resets.
  • metadata.tokens_used — credits consumed. Always 0 when no data is returned. Sent on token-bound (free) accounts only — accounts on an unlimited plan omit it.
  • metadata.tokens_remaining — your remaining credit balance after this request. Token-bound accounts only.
  • metadata.personal_email_restricted — present and true only when the call withheld personal-email data because your plan doesn’t include that surface. Read the missing field as a plan boundary, not as absent data.
  • metadata.phone_tokens_used / metadata.phone_tokens_remaining — linkedin_to_mobile_phone only; no other tool reports phone tokens.
The HTTP status says whether the call completed. The body says what happened. Branch on status, not on the HTTP code.

Reading an outcome

Every call ends in one of three outcomes: A not-found is a normal result, not a failure. The tool ran, the lookup was clean, and the data simply isn’t on file for that input — so nothing is charged. It still counts as one request against your Fair Use requests limit.
Batches behave the same way. A batch returns 200 and its body is the per-item report — each entry carries its own status, so a batch of 100 where 12 matched returns 12 hits and 88 misses in one 200. A batch where nothing matched is still 200 with status: "not_found", not an error.
This changed. Lookups that found nothing used to return 404. They now return 200 with status: "not_found", on single calls and batches alike. If your integration treats a 404 as “no data”, switch it to read status — the only 404 the API still returns is tool_not_found, meaning the tool name in the URL is unknown or retired.

Reading the outcome without parsing the body

Every tool response also carries an X-MoltSets-Outcome header — ok, not_found, or the error code. Proxies, log pipelines, and clients that would rather not parse JSON can branch on it directly. It is absent on requests that ran no tool, such as an auth failure.

Errors

Errors use a single shape on both REST and MCP:
Branch on error.code, not on the message text. Nothing is charged on an error.

When a call returns a 500

A 500 with internal_error means the call couldn’t complete. Usually the endpoint is temporarily unavailable, but an unusually large or heavy request can also fail this way:
Try a smaller request first. If the call was a batch, split it into smaller batches and resend them. If the smaller requests succeed, keep your batches at that size. The MoltSets team is alerted automatically, so there’s no need to report it. If a smaller request fails too, the endpoint is temporarily unavailable. Resolution time varies, largely with when the outage starts: one that begins during office hours is picked up sooner than one overnight or over a weekend. Because of that, don’t build a fixed retry delay around it — treat it as a transient failure in your pipeline, not a bad record, and requeue the affected calls to retry later instead of looping on the endpoint. A later call succeeding is the signal that the endpoint is back.

Plans

Records are the data rows returned; requests are capped separately — see Rate Limits. Phone tokens for linkedin_to_mobile_phone aren’t included in any plan. They’re sold as a separate monthly subscription, available on paid plans only — see Phone tokens.
linkedin_to_personal_email_usa and linkedin_to_best_personal_email_usa are not available on every plan — access is set by price tier. Call get_account and read personal_email_available to know where yours stands. Both return US records only — non-US records are filtered out, so a non-US profile comes back as a not_found.Calls from an account without access return 403 with:
Contact support@moltsets.com to request access.
email_to_maid, business_email_to_sha256, and linkedin_to_sha256 are not available on the $397 / month and $997 / month plans. Calls from those plans return 403 with plan_restricted. It’s a plan condition — retrying or topping up tokens won’t clear it.

Choosing a plan

The right plan depends on how fast you need results. Higher rate limits mean faster processing — the difference between waiting an hour and wrapping up in minutes.

More information

For more information on our plans, upgrading and downgrading processes, please refer to our support documentation at support.moltsets.com.

Available tools

* linkedin_to_personal_email_usa and linkedin_to_best_personal_email_usa are not available on every plan — access is set by price tier. Call get_account and read personal_email_available to know where yours stands. See Plans for the error they return. Without access, use linkedin_to_business_email instead.Both return US records only — non-US records are filtered out, so a non-US profile comes back as a not_found.
† Not available on the $397 / month and $997 / month plans. See Plans.
Switch to the _usa tools. The personal-email tools were previously named linkedin_to_personal_email and linkedin_to_best_personal_email. To migrate, add _usa to the end of the tool or route name — same data, same format, with non-US records now filtered out. The old names still work for now but will be retired in the near future — switch to the _usa names before then.

What to do next

Authentication

Get your API key and learn how to authenticate requests.

Rate Limits

Understand the limits that apply to all plans.