Files
OmniRoute/docs/reference/FREE_PROXIES_API.md
Paijo b5e75bb8fe fix(proxy): relay repair + free-pool UX + relay awareness (#6909)
* feat(proxy): relay repair + free-pool UX + relay awareness

* fix(proxy): preserve existing notes fields on relay repair; fix cpu limit /1000 across all 5 container providers

* feat(proxy): extract bulk-import and pool-modal hooks (#6625)

* fix: prevent relay type normalization to http on PATCH

Bug: updateProxyRegistrySchema inherited .default("http") from the base
schema, causing PATCH to silently overwrite relay types (vercel/deno/cloudflare)
with "http" when the client didn't send a type field.

- Move .default('http') from proxyRegistryFieldsSchema to
  createProxyRegistrySchema (only applies to new proxies)
- Strip undefined keys from validated changes before passing to
  updateProxy — .partial() leaves absent fields as undefined, which
  the spread merge in updateProxyRow would propagate to the DB
- Add console.warn in extractRelayAuth when decrypt fails on a
  known-encrypted relayAuthEnc blob

Closes #6905

* feat: replace Load More with page-number pagination in FreePoolTab

- Adds page-number pagination controls with prev/next buttons
- Shows per-page summary with total counts
- Resets to page 1 on filter change via wrapper setters

* fix(proxy): restore free-proxy sync-error tracking reverted by pagination commit

commit 2c8e79f13 (page-number pagination for FreePoolTab) accidentally
reverted the recordFreeProxySyncErrors/clearFreeProxySyncErrors/
getFreeProxySyncErrors functions and the search/sortBy list options that
an earlier commit (6f9ce75f3) in this same PR had added to
src/lib/db/freeProxies.ts and src/app/api/settings/free-proxies/route.ts.

localDb.ts still re-exported the three sync-error functions, so every
module that transitively imports it (which is most of the unit test
suite, plus the Next.js build used by dast-smoke) failed at load time
with "The requested module './db/freeProxies' does not provide an
export named 'clearFreeProxySyncErrors'".

Restores the reverted implementation (verbatim) and fixes the two new
"requires management auth" tests, which asserted 401 for an
unauthenticated request without configuring INITIAL_PASSWORD +
requireLogin first — on a fresh DB with no password configured,
isAuthRequired() treats a loopback request as the pre-setup bootstrap
path and allows it through, so the assertion needs the same
password/requireLogin setup already used by
tests/unit/api/settings-audit.test.ts.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>

* fix(proxy): trim unrelated scope from relay-repair/free-pool PR

Remove two subsystems that are unrelated to relay repair and the
free-pool UX and were never wired into the app:

- open-sse/services/combo/capabilityRequirements.ts and
  CapabilityRequirementsEditor.tsx: a combo capability-filtering
  feature never imported by combo.ts or combos/page.tsx, with no
  test coverage.
- src/lib/skills/containerProvider.ts CPU-limit rescale: an
  untested change to sandbox resource limits, unrelated to the
  proxy/relay subsystem this PR targets. Restored to the
  release baseline.

Also renumber the free_proxy_sync_errors migration 121 -> 122 to
avoid colliding with #6855, which independently claims 121 on the
same release branch.

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>

---------

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>
Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
2026-07-12 02:28:26 -03:00

3.7 KiB

title, version, lastUpdated
title version lastUpdated
Free Proxies API 3.8.43 2026-07-11

Free Proxies API

OmniRoute ships a curated pool of free proxies in the free_proxies table, synced from external providers (1proxy, proxifly, iplocate, webshare). The dashboard surfaces these under Settings → Free Proxies. This document covers the server-side filtering, sorting, counting, and sync-error reporting that the list route exposes.

List route — GET /api/settings/free-proxies

Returns a filtered, sorted, paginated slice plus a total count. Filtering and counting happen in SQL, so the UI can show the real total (e.g. Total: 0) without loading every row into memory.

Query parameters

Param Type Default Meaning
search string "" Case-sensitive LIKE on the host (and source) column.
protocol string "" type filter: http / https / socks4 / socks5. Empty = all.
country string "" countryCode filter (ISO-2). Empty = all.
minQuality number 0 Only rows with qualityScore >= minQuality. 0 = no floor.
disabledSources string "" Comma-separated source ids to exclude (e.g. proxifly,webshare).
sortBy quality | latency | recent quality quality = score desc; latency = latency asc (nulls last); recent = lastValidated desc.
offset number 0 Pagination start.
limit number 50 Page size (capped server-side).

Response

{
  "success": true,
  "data": {
    "proxies": [/* FreeProxyRecord[] */],
    "total": 137,
    "hasMore": true
  },
  "stats": {
    "total": 137,
    "inPool": 12,
    "avgQuality": 64.2,
    "bySource": [{ "source": "1proxy", "count": 90 }],
    "lastSyncAt": "2026-07-11T09:30:00.000Z"
  },
  "syncErrors": {
    "proxifly": ["HTTP 429 from upstream"],
    "webshare": ["network timeout"]
  }
}

total reflects the filtered total before pagination, so the UI can render Total: N and hasMore independently. syncErrors is keyed by source id and populated only for sources that failed their last sync — a Total: 0 result is never silent.

Add-to-pool — POST /api/settings/free-proxies/[id]/add-to-pool

Promotes a free proxy into the managed proxy_registry pool. Validates the upstream first; on success returns the new pool proxy id and measured latency.

Sync — POST /api/settings/free-proxies/sync

Re-pulls all enabled sources (or the subset in { "sources": [...] }). Each source syncs independently; a failing source is recorded in syncErrors and the others still complete, so partial syncs never wipe prior good data.

Stats — GET /api/settings/free-proxies/stats

Returns the total / inPool / avgQuality / bySource / lastSyncAt aggregate without the row payload — used by the dashboard header widgets.