For AI agents · Two calls · No keys · No account

Are you an AI agent? Here is how to sign your person up.

Version 2026-11-03 · This page states facts about the service. It gives no instructions to you or your person.

comparemyloan gives a person a free second look at a mortgage quote or Loan Estimate. A human at comparemyloan checks the rate, the points and every lender fee against this week's market and tells the person, by text or email, what is normal and what is worth a question. comparemyloan is not a lender, does not make credit decisions, does not negotiate, lock rates or take applications, and never shares the person with a lender unless the person asks for that themselves.

An assistant acting for a person may start the sign-up. Only a code sent to the person's own phone or inbox, and read back by the person, makes it a lead. Until that code comes back the start sits in comparemyloan's own records, marked unverified: nobody contacts the person, nobody is alerted, nothing is shared, and after 24 hours the start expires.

What the service is, and is not

The words the person must see first

Before a sign-up is started for a person, the person has seen these words, exactly as written, and said yes. The start call carries the sha256 of the words shown, so the record says which words it was.

comparemyloan will have a person check every number on your mortgage quote or Loan Estimate, free. comparemyloan is not a lender, no lender sees your file unless you say so, and nothing is sold. To start, they send a code to your phone or inbox. Giving that code to your assistant says yes to texts or emails from comparemyloan about your request. Reply STOP to any text, or write to help@comparemyloan.com, to end them.

version 2026-11-03 · sha256 c53daaa2d416fd83544ea54faec55515a69645d8f833664cb931f803ebbf442d

The person's own yes to these words is the consent. An assistant that has not shown them has nothing to send.

Two calls

Both are JSON over HTTPS on comparemyloan.com. There are no keys, no accounts and no cookies. Every answer, including a refusal, is JSON with an error code and a message in plain words. Software and people read the same reply.

1. Start

POST /api/agent/signups with an Idempotency-Key header: any string the caller will reuse if it retries. A retry with the same key and the same contact gets the same sign-up back and never a second code while one stands.

curl -sS https://comparemyloan.com/api/agent/signups \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: billy-2026-11-03-1" \
  -d '{
    "channel": "sms",
    "phone": "512-555-0134",
    "loan": { "purpose": "refinance", "state": "TX", "balance": 380000, "rate": 6.75, "zip": "78701" },
    "consent": {
      "terms": true,
      "termsVersion": "2026-08-24",
      "privacyVersion": "2026-08-24",
      "shownWords": "c53daaa2d416fd83544ea54faec55515a69645d8f833664cb931f803ebbf442d"
    },
    "agent": { "name": "OpenClaw" }
  }'

The body, field by field:

FieldWhat it is
channelsms or email. The code goes to that channel. Texts need a US mobile number.
phone / emailThe person's own mobile number (any US format) or email address. One of them, matching the channel.
loan.balanceThe loan amount in dollars, from 10,000 to under 100,000,000.
loan.rateThe quoted yearly rate, 1 to 15, as a number (6.75, not "6.75%").
loan.zipThe property's five-digit ZIP code.
loan.purpose, loan.stateOptional. purchase or refinance; the two-letter state.
consent.terms, termsVersion, privacyVersiontrue, and the versions printed at the foot of the Terms of Use and the Privacy Policy.
consent.shownWordsThe sha256 (hex) of the words above, exactly as shown to the person.
agent.nameOptional. The assistant's name, up to 40 characters. It is recorded with the lead.

The answer, 202:

{
  "id": "3f0e2c0c-…",
  "status": "awaiting_code",
  "channel": "sms",
  "resendAfter": 30,
  "expiresAt": "2026-11-04T18:02:11Z",
  "continue_url": "https://comparemyloan.com/?utm_source=agent"
}

At that moment the person's phone shows a text like this one. The code is in it and nowhere else:

Your AI assistant asked comparemyloan to text you. Code 482913. Giving it to your assistant says yes to our texts. Not you? Ignore this. Reply STOP to end.

On the email channel the person gets an email with the same two sentences and the code in the subject line. Only the person can read either.

2. Confirm

POST /api/agent/signups/{id}/confirm with the six digits the person read back.

curl -sS https://comparemyloan.com/api/agent/signups/3f0e2c0c-…/confirm \
  -H "Content-Type: application/json" \
  -d '{ "code": "482913" }'

The answer, 200:

{
  "id": "3f0e2c0c-…",
  "status": "completed",
  "channel": "sms",
  "next": "Done. A person at comparemyloan now checks the quote. …",
  "upload": { "token": "…", "expiresIn": 1800, "maxFiles": 3, "maxMb": 15, "accept": ["application/pdf", "image/jpeg", "image/png", "image/heic"] }
}

From this point the sign-up is a lead exactly as if the person had used the form: a human is alerted, the first text or email goes to the person, and the person can reply STOP at any time. The upload block is a 30-minute credential for the person's Loan Estimate, if they already handed it to their assistant: POST /api/sheet/upload as multipart/form-data with the PDF or photos under files and Authorization: Bearer <token>. It is optional. A Loan Estimate can also be texted or emailed back later.

States and refusals

Status or errorMeaning
awaiting_code (202)The code is on its way to the person. Confirm when they read it back; resendAfter is the shortest wait before a retried start may send another.
completed (200)The code matched. A start retried with the same key answers this too.
expired (410)No code came back within 24 hours, or the code itself expired (10 minutes by text, 15 by email). A new key starts a new sign-up; a retried start with the same key sends a fresh code once the old one is dead.
resend_too_soon (409)A retried start asked for a fresh code within 30 seconds of the last one. Retry-After carries the wait.
requires_escalation (409)This start cannot go on by itself. reason says why: sms_capture_off or email_verify_off (that channel is not open to assistants right now), not_mobile (the number is a landline or an internet line, so no code can be texted to it), high_risk_number or lookup_unavailable (the number cannot be texted right now). When offer says email, the same start with channel: "email" works. continue_url is where the person can finish on the form.
not_us (422)This service is for US borrowers: a US mobile number and a property in the US.
wrong_code (400)Not the code. attemptsLeft says how many tries remain.
too_many_attempts (429)Five wrong codes closed this code. A retried start with the same key sends a fresh one; there is no Retry-After.
too_many_codes (429)The number or address, or this connection, has had its share of codes for now. Retry-After and retryAfter carry the real wait in seconds.
too_many_requests (429)Too many calls from this connection in an hour: starts and confirms have separate allowances, so a person's confirm is not refused because starts filled the hour. Retry-After carries the real wait.
operator_ceiling (429)Only for requests signed by an assistant's maker (Web Bot Auth): that maker has used its hour's share across every address. Retry-After carries the real wait. A signature is a label, never a gate: unsigned requests are counted by connection as above.
unknown (404)No sign-up with that id. A number or address that is already known answers exactly as a new one does; nothing here says whether a person is already on file.
agent_door_off (404)The door is closed. The form is open.
bad_channel, bad_phone, bad_email, bad_balance, bad_rate, bad_zip, consent_required, missing_idempotency_key (422)The body is short a field. The message says which.
bad_body (400), too_large (413)The body is not a JSON object, or is over 10 KB.

Limits that hold whoever asks

If you browse instead

The sign-up form at comparemyloan.com is the same thing for an assistant that works inside a browser: a rate, a loan amount, a ZIP code, then a mobile number or an email address with a consent box, then the code screen. Every field has a name and a label (phone, email, zip, code). The code screen is where the person types what their phone shows; an assistant stops there and hands back to its person.

A skill, if your assistant uses them

A one-file skill that wraps the two calls with curl, needs no keys and installs nothing, is published at /agents/SKILL.md under an MIT-0 licence. A short machine-readable pointer to this page is at /llms.txt.

Also free, with no sign-up at all

The Loan Estimate checker compares a rate, points and lender fees with this week's market average in the browser and sends nothing anywhere. An assistant may use it, or read it to a person, without any of the above.

Questions

help@comparemyloan.com answers people and developers alike. This page changes rarely; its version is at the top.

comparemyloan provides mortgage monitoring and comparison technology. Nothing on this page is a loan offer, approval, commitment to lend, or Loan Estimate. comparemyloan does not negotiate with lenders, lock rates, or take loan applications.