Moxlade
Checking your account

Refusals

Everything this server turns down, and what to do about it. An agent that can enumerate the ways a call fails can plan around them; one that cannot will retry into a cap.

The shape of a refusal

A refused tool call is HTTP 200 with result.isError: true and the reason in the text. If you branch on status codes you will read every refusal as a success. Authentication is the exception: no token, or a bad one, is a real 401 with WWW-Authenticate.

Refusals are written to be acted on rather than logged — each says what was wrong and what would fix it. They are also recorded: get_activity shows the refusal text alongside the call, which is the fastest answer to "why did my agent stop".

Authentication

whenwhat it sayswhat to do
No Authorization headermissing bearer tokenSend Authorization: Bearer mxt_… or complete the OAuth flow. This one is a real HTTP 401 with WWW-Authenticate, not a tool error.
A token we do not know, or one you replacedunknown or revoked tokenMinting a new token revokes the previous one. Use the newest, or mint again at /connect.
The account's access was withdrawnthis account's access has been revokedNot a token problem — the account is closed. Contact support.

Plan

whenwhat it sayswhat to do
The trial ended and no subscription startedthe refusal names the price and where to payRelay it to your user; it is a message, not an error to retry. get_plan and get_activity keep answering so they can see what they had.

Caps

whenwhat it sayswhat to do
Too many calls todaydaily cap reached: N calls per token per day. It resets at UTC midnight.Stop for the day. Read get_plan.usage BEFORE a long paging walk — every page is one call.
Too many DISTINCT corpus questions todaycorpus query cap reached: N distinct corpus questions per token per day. Repeating a question you already asked today is still free.Re-asking something you already asked costs nothing. Sweeping with ever-changing arguments is the pattern this stops.

Reach — the feed gate

whenwhat it sayswhat to do
get_job / get_buyer / get_buyer_quality / get_job_score on a posting this corpus has not shown youthis posting is not in your feed…Run search_jobs with a filter that finds it, or save_search — saving also back-fills recent matches. An id from a scraped list or a competitor's export will not resolve, by design.

Arguments

whenwhat it sayswhat to do
search_jobs with nothing to search onpass query, phrase or filters — search_jobs never returns the whole corpusAt least one is required. get_prefilter_catalog for field names, or see the filter reference.
An empty or whitespace-only skillskill must not be empty — this tool has no all-of-corpus formName a skill, however broad. An argument meaning 'no constraint' is not allowed to mean 'everything'.
A value outside its rangethe argument, then what it accepts — e.g. limit: Input should be less than or equal to 50The bound is in the tool's inputSchema; read it rather than probing. Nothing is silently clamped.
An argument the tool does not take<tool> has no argument 'x'. It takes: …Usually a typo. The accepted names are listed in the message.
A cursor from a different searchthis cursor belongs to a different search…Paging on it would mix two result sets. Drop the cursor to restart, or re-send the original search unchanged.
A filter naming a field that does not existunknown field — not in the job attribute catalogRefused rather than ignored, so a typo cannot silently widen your filter.
A webhook we will not callwebhook_url must be https / resolves to a private address / has no hosthttps only, and it must not resolve to a private, loopback or reserved address.

Answers that look like errors and are not

whenwhat it sayswhat to do
Fewer than five freelancers matchinsufficient_data: true, with the k-floorNot a failure. A statistic over fewer than five describes an individual. Widen the skill or drop the country.
A filter that is valid and cannot matchwarnings: … cannot match: the highest value in the corpus is NStill valid — bounds are observed values, not limits. But a saved search built on it fires forever without ever telling you it was the filter.
delete_saved_search on something already gonedeleted: false, with a noteAn answer, not an error.

↑ top