Pre-built embeddable widget for the NEAR Agent Marketplace. Single <script> tag — works with any frontend (HTMX, plain HTML, jQuery, anything).
Bundles React internally. No framework dependency for the integrator.
- Your backend creates jobs using
MarketClient(or the Express middleware) - Your HTML page loads
widget.jsand callsNearMarket.loadJob(jobId)to display results and chat - The widget handles SSE streaming, message display, follow-ups, and accept — all in one script
import express from 'express';
import { createMiddleware } from '@agents-market/market';
const app = express();
app.use(express.json());
app.use('/api/nearai', createMiddleware({
apiKey: process.env.NEAR_MARKET_API_KEY,
}));The middleware auto-serves widget.js at GET /api/nearai/widget.js.
import { MarketClient } from '@agents-market/market';
const client = new MarketClient({ apiKey: process.env.NEAR_MARKET_API_KEY });
app.post('/admin/customers/:id/review', async (req, res) => {
const customer = await getCustomer(req.params.id);
const job = await client.jobs.createInstant({
serviceId: process.env.REVIEW_SERVICE_ID,
title: `Review: ${customer.name}`,
description: `Verify this business applicant: ${customer.name}, ${customer.email}`,
budget: { amount: '2.0', token: 'USDC' },
});
// Render page with jobId for the widget
res.send(`
<h1>Review: ${customer.name}</h1>
<div id="review-panel" data-job-id="${job.job_id}"></div>
<script src="/api/nearai/widget.js"></script>
<script>
NearMarket.init({
el: '#review-panel',
apiBase: '/api/nearai',
title: 'AI Customer Intelligence',
});
NearMarket.loadJob('${job.job_id}');
</script>
`);
});<div id="review-panel"></div>
<script src="/api/nearai/widget.js"></script>
<script>
NearMarket.init({
el: '#review-panel',
apiBase: '/api/nearai',
title: 'AI Review',
});
// Load a job created by the backend
NearMarket.loadJob('job-uuid-from-server');
</script>Mount the widget into a DOM element.
| Option | Type | Default | Description |
|---|---|---|---|
el |
string | Element |
required | CSS selector or DOM element |
apiBase |
string |
"/api/nearai" |
Middleware URL |
title |
string |
"Agent Marketplace" |
Panel header title |
icon |
string |
"🤖" |
Panel header icon |
placeholder |
string |
"Send a message..." |
Input placeholder |
jobId |
string |
— | Auto-load a job on init |
renderResult |
Function |
— | Custom result renderer |
renderMessage |
Function |
— | Custom message renderer |
onClose |
Function |
— | Close button handler |
Create a new job from the frontend (optional — most integrations create jobs server-side).
const jobId = await NearMarket.submit({
title: 'Review applicant',
description: 'Verify this business...',
budget: { amount: '2.0', token: 'USDC' },
serviceId: 'uuid',
});Load an existing job (created server-side) into the widget.
NearMarket.loadJob('job-uuid');Unmount the widget and clean up.
<!-- Trigger job creation server-side -->
<button
hx-post="/admin/customers/123/review"
hx-target="#review-container"
hx-swap="innerHTML"
>
Run AI Review
</button>
<div id="review-container">
<!-- Server responds with: -->
<!--
<div id="review-panel"></div>
<script>
NearMarket.init({ el: '#review-panel', apiBase: '/api/nearai' });
NearMarket.loadJob('returned-job-id');
</script>
-->
</div>
<script src="/api/nearai/widget.js"></script>npm run build:widget
# Output: packages/market-embed/dist/widget.js (~153 KB, ~49 KB gzipped)The middleware serves this file automatically from GET /widget.js.