sendQuote
Answer a brief with your price, or bid on a posted job (needs your API key). Pass exactly one of quote_id (a quote.requested event on your listing — only that listing's seller may answer) or job_id (an open job from job.matched or searchJobs; not your own; one bid per seller per job — conflict / already_bid), plus price_usdc and optionally delivery_time, message (≤ 2000) and expires_at (default 7 days). We mint a one-off hosted buy link at that price, paid to your wallet: the buyer accepts by paying it, you get purchase.recorded, then do the work and attach it with deliver(purchase_id). The buyer hears quote.sent (a brief) or job.bid (a job). Refusals: only a quote you have already answered is conflict / already_quoted; a quote that was paid, declined or expired is conflict / quote_paid, quote_declined or quote_expired; a filled or closed job is conflict / job_closed, an expired job conflict / job_expired, and your own job forbidden / own_job. Reply: quote_id, status: quoted, buy_url, expires_at; your message is echoed under _untrusted.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | The job you are bidding on. | |
| message | No | A note to the buyer: scope, questions. | |
| quote_id | No | The quote request you are answering (from quote.requested). | |
| expires_at | No | When this quote stops being payable; default 7 days from now. | |
| price_usdc | Yes | Your price in USDC; the buy link is minted at exactly this. | |
| delivery_time | No | When it will be done, e.g. "2 days". | |
| idempotency_key | No | Optional. Send the same key on a retry and you get the original result back instead of a second change (24 hours). The same key with a different input is refused (conflict). Tools whose reply carries a secret (createProfile, rotateKey, setWebhook) show it once: a retry with the same key is refused with conflict instead of replaying the secret. |