Uruguay Crawler - Maroñas
Version 1 · Created the Uruguay crawler page with calendar/meeting/horse endpoints, JSON and XML structures, run commands, limitations, verification, and module changelog.
Uruguay Crawler - Maroñas
Last reviewed: 2026-08-08 AEST
Module identity
- Country: Uruguay
- Program/source name: Hipica Maroñas and the associated first-party mobile service
- Adapter source ID:
uy_maronas - Python module:
src\formcrawler\sources\uy\maronas.py - Results launcher:
scripts\crawl_maronas_results.bat - Horse-profile launcher:
scripts\crawl_maronas_horse_profile.bat - Discipline: Thoroughbred (
T) - Racing jurisdiction code:
URU - ISO country code:
UY - Public host:
hipica.maronas.com.uy - First-party service host:
mobile-rest-services-v3.azurewebsites.net
Scope and key pages
| Public page or action | First-party endpoint | Artifact |
|---|---|---|
Calendar range: /?start=YYYY-MM-DD&end=YYYY-MM-DD |
POST /XTurfRestService.svc/GetRacingCalendarHistory |
Calendar JSON |
Meeting: /RacingInfo/RacingDate?RacingDate=<date>&RaceTrackId=<id> |
GET /XTurfResourcesService.svc/GetRacingDocument?...&exportFormat=XML |
Complete meeting-result XML |
Horse search: /RacingInfo/Search?SearchString=<name> |
POST /XTurfRestService.svc/SearchParticipants |
Search JSON |
Horse card: /RacingInfo/HorseCard?HorseId=<id> |
POST /XTurfRestService.svc/GetHorseCard |
Horse-profile JSON |
The calendar covers Maroñas, Las Piedras, Paysandú, and supported interior track meetings returned by the source. Only meetings with ProgramStatusId=1 inside the exact requested range are queued.
Capture workflows
Meeting results
- Submit one bounded calendar POST for the entire inclusive range.
- Preserve the calendar JSON control artifact.
- Filter its returned dates to the requested range.
- Read each published meeting's
RacingPeriod.RaceTrackidentity. - Queue one complete
ResultadoCarreraWebXML document per track meeting. - Validate meeting date and at least one positive official placing.
- Store immutable JSON/XML, metadata, and FormParser handoffs.
Exact horse profile
- Submit one exact-name search POST.
- Inspect
Data[]and retain only an equine result (Type=1) whose normalized displayed name exactly matches the requested name. - Queue one horse-card POST for the numeric
EntityId. - Validate that
Horse.Idmatches andHorse.Nameis present. - Preserve the raw returned profile, including incomplete breeding and source placeholder dates, for FormParser.
Source and artifact data structure
Calendar JSON
The response is a top-level array. Each date object can expose:
Date;RacingDates[];- meeting
ProgramStatusIdandOrdinal; RacingPeriod, includingIdand nestedRaceTrackfields such asId,Name,InternationalCode, andShortName.
Calendar target metadata includes start_date, end_date, and compact date. Meeting targets can additionally include track_id, track_name, track_code, meeting_ordinal, and period_id.
Meeting XML
The result document has root RacesCharts, with one RaceCharts node per race. It includes meeting/track values, race-level content, runners, and OfficialFinish nodes. One XML artifact covers the complete meeting rather than requiring one request per race or runner.
Horse JSON
The search response is a JSON object with Data[]. The horse-card response is a JSON object containing Horse and available related horse, sire, dam, damsire, and performance information. FormCrawler checks only identity/readiness; it does not normalize missing fields.
C:\Users\Robert\project-data\FormCrawler\t-artifacts\<year>\URU\uy_maronas\<event>\
C:\Users\Robert\project-data\FormParser\inbox\T\<year>\URU\uy_maronas\<artifact-id>.json
How to run
Full meeting-results range:
.\scripts\crawl_maronas_results.bat 2026-08-01 2026-08-06
One-date, one-meeting smoke test:
.\scripts\crawl_maronas_results.bat 2026-08-02 2026-08-02 1
Use a third value of 0 for discovery only. Rerun the same range without a limit to resume all queued meetings.
Exact horse lookup:
.\scripts\crawl_maronas_horse_profile.bat "Corazon Rebelde"
Equivalent generic range command:
python scripts\formcrawler.py capture-date-range `
--source uy_maronas `
--start 2026-08-01 `
--end 2026-08-06
Known limitations and recovery
- Calendar, search, and horse-card controls use source-required POST bodies.
- Robert's URL-only proxy transport cannot reproduce those POST bodies and must not be enabled for these workflows.
- Only an exact normalized horse-name match is captured.
- Missing breeding fields and placeholder dates are intentionally preserved unchanged.
- A meeting without complete XML or positive official placings remains retryable.
- Stop with Ctrl+C and rerun the same range or horse name to resume safely.
Verification
On 2026-08-07, a 2026-08-02 Maroñas meeting produced a 471,938-byte XML with 11 races and 142 horses/official finishes. A 2026-08-01 multi-track run captured complete eight-race XML files for Maroñas and Paysandú at 304,943 and 208,874 bytes. An independent July scan discovered 17 meetings; a bounded 2026-07-31 follow-up captured a 417,274-byte Las Piedras XML with 11 races and 124 official finishes. Exact lookup for Corazon Rebelde found horse 72002 and stored a 2,136-byte profile after a 200-byte search response. Hashes and handoffs matched.
Module changelog
2026-08-07 - Historical verification and horse profiles
- Added exact-name horse search and horse-card JSON capture.
- Added
crawl_maronas_horse_profile.batandcapture-discoveredsupport. - Verified the
Corazon Rebeldeprofile, incomplete breeding preservation, and 23.969-second same-host spacing. - Independently verified July discovery, Las Piedras capture, and multi-track Maroñas/Paysandú results.
2026-08-07 - Initial meeting-results implementation
- Added
uy_maronaswith one POST-backed calendar control per inclusive range. - Added locally filtered published-meeting discovery and one complete XML target per track meeting.
- Added persisted safe POST request definitions, date-range processing, queue resume, and
crawl_maronas_results.bat. - Live-verified meeting XML structure, official finishes, artifact hashes, and FormParser handoffs.