Skills farmos-land-portfolio
Query land ownership, leases, landlord info, and land payments. Write operations for payment management and lease renewals.
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/brianppetty/farmos-land-portfolio" ~/.claude/skills/openclaw-skills-farmos-land-portfolio && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/brianppetty/farmos-land-portfolio" ~/.openclaw/skills/openclaw-skills-farmos-land-portfolio && rm -rf "$T"
skills/brianppetty/farmos-land-portfolio/SKILL.mdFarmOS Land Portfolio
Track owned and leased land, lease terms, landlord relationships, payments, and annual land costs.
CRITICAL: Data Completeness Rules
NEVER use partial or truncated data. These rules are non-negotiable:
- NEVER use
— it truncates results to 5 items. Partial payment data is worse than no data because it creates a false sense of completeness./api/integration/dashboard - ALWAYS use the
endpoints listed below for complete data./all - If an endpoint returns an error or empty results, REPORT THE FAILURE to the user. Do not silently fall back to a different endpoint or present partial data.
- ALWAYS state the total count of records returned so the user knows the data is complete. Example: "Found 11 payments due in March totaling $175,058."
- If you cannot get complete data, say so explicitly. "I was unable to retrieve complete payment data" is infinitely better than showing 5 of 11 payments.
When This Skill Triggers
- "When do our leases expire?"
- "What's the rent on the Smith ground?"
- "Total land costs this year?"
- "Show overdue payments"
- "Landlord contact info"
- "Cost per acre by parcel"
- "List all leased parcels"
- "What payments are due in March?"
- "Cash requirements for next month"
- "Mark payment [X] as paid"
- "Mark all March payments paid"
- "Renew the Smith lease"
- "Preview lease renewals"
Access Control
Lease terms, rent amounts, and landlord info are sensitive business data. Restrict to admin or manager roles only.
Role mapping: Check the sender's role in
~/.openclaw/farmos-users.json. If the user is not admin or manager, tell them they don't have access to land portfolio data.
API Base
Integration Endpoints (No Auth Required) — READ OPERATIONS ONLY
IMPORTANT: Use auth endpoints for WRITE operations (mark-paid, renewals). Use integration
endpoints for READ operations (listing payments, leases, landlords)./all
Payments (FULL — use this, not dashboard)
GET /api/integration/payments/all
- Returns ALL payments with full details — parcel names, landlord names, overdue status
- Query parameters:
— pending, paid, overdue, scheduledstatus
— rent, mortgage, property_tax, insurance, improvement, otherpayment_type
— filter by specific parcelparcel_id
— YYYY-MM-DD range startdue_date_from
— YYYY-MM-DD range enddue_date_to
— filter by crop yearcrop_year
- Examples:
- All overdue:
/api/integration/payments/all?status=overdue - March 2026 payments:
/api/integration/payments/all?due_date_from=2026-03-01&due_date_to=2026-03-31 - All rent payments:
/api/integration/payments/all?payment_type=rent
- All overdue:
Upcoming Payments (next N days)
GET /api/integration/payments/upcoming?days=30
- Returns ALL upcoming payments within N days (no truncation)
- Use
ordays=60
for longer lookaheaddays=90
Leases (FULL)
GET /api/integration/leases/all
- Returns ALL leases with landlord contact info, rent terms, expiration status
- Query parameters:
— active, expiredstatus
— filter by landlordlandlord_id
Expiring Leases
GET /api/integration/leases/expiring?days=90
- Returns ALL leases expiring within N days
Landlords (FULL)
GET /api/integration/landlords/all
- Returns ALL landlords with contact info, active lease count, total acres, total rent
Parcels
GET /api/integration/parcels
- Returns ALL parcels with ownership type, acres, county
- Query parameter:
— owned, leasedownership_type
Summary Stats
GET /api/integration/summary
- Total acres, owned/leased breakdown, parcel/lease/landlord counts, annual cost
Annual Land Costs (by month and entity)
GET /api/integration/finance/costs?year=2026
- Monthly cost breakdown by category (rent, mortgage, tax, insurance)
- Entity breakdown
- Query parameters:
,yearentity_id
Cost Per Field (for P&L)
GET /api/integration/finance/cost-per-field?year=2026
- Land costs allocated to production fields
- Query parameters:
,yearentity_id
Overdue Items
GET /api/integration/tasks/overdue
- All overdue payments and reminders — high priority items
Actionable Items
GET /api/integration/tasks/actionable?days_ahead=30
- Upcoming payments, expiring leases, pending reminders
Authenticated Endpoints — WRITE OPERATIONS
These require JWT auth. See Authentication section below.
Authentication
This skill accesses protected FarmOS endpoints that require a JWT token.
To get a token: Run the auth helper with the appropriate role:
TOKEN=$(~/clawd/scripts/farmos-auth.sh admin)
To use the token: Include it as a Bearer token:
curl -H "Authorization: Bearer $TOKEN" http://100.102.77.110:8009/api/endpoint
Token expiry: Tokens last 15 minutes. If you get a 401 response, request a new token.
Mark Single Payment Paid
POST /api/payments/{id}/mark-paid Authorization: Bearer {token} Content-Type: application/json
Body:
{ "paid_date": "2026-02-15", "notes": "Check #1234" }
Mark Multiple Payments Paid (Bulk)
POST /api/payments/bulk/mark-paid Authorization: Bearer {token} Content-Type: application/json
Body:
{ "payment_ids": [12, 34, 56], "paid_date": "2026-02-15", "notes": "Batch check run" }
Mark Payments Paid by Date Range
POST /api/payments/bulk/mark-paid-by-date Authorization: Bearer {token} Content-Type: application/json
Body:
{ "due_date_from": "2026-03-01", "due_date_to": "2026-03-31", "paid_date": "2026-02-15", "payment_type": "rent", "notes": "March rent payments" }
Use this when the user says "mark all March payments as paid" or similar bulk date-based operations.
Preview Lease Renewal
POST /api/leases/renewal-preview Authorization: Bearer {token} Content-Type: application/json
Body:
{ "lease_ids": [5, 12], "new_start_date": "2027-03-01", "rent_increase_percent": 3.0 }
Returns: Preview of what the renewed leases would look like, including new payment schedules. Use this BEFORE executing bulk renewals so the user can confirm.
Execute Bulk Lease Renewal
POST /api/leases/bulk-renew Authorization: Bearer {token} Content-Type: application/json
Body:
{ "lease_ids": [5, 12], "new_start_date": "2027-03-01", "new_end_date": "2028-02-28", "new_rent_amount": 52000.00, "rent_increase_percent": 3.0, "notes": "Annual renewal with 3% increase" }
IMPORTANT: Always preview first, confirm with user, then execute.
Year-End Rollover Preview
POST /api/payments/year-end-rollover/preview Authorization: Bearer {token} Content-Type: application/json
Body:
{ "from_year": 2026, "to_year": 2027 }
Returns: Preview of payment schedules that would be created for the new crop year.
Year-End Rollover Execute
POST /api/payments/year-end-rollover/execute Authorization: Bearer {token} Content-Type: application/json
Body:
{ "from_year": 2026, "to_year": 2027, "apply_rent_increase": true, "rent_increase_percent": 2.5 }
IMPORTANT: This creates next year's payment schedules based on current year leases. Always preview first.
FORBIDDEN Endpoints — Do NOT Use
| Endpoint | Why |
|---|---|
| Truncates to 5 items. NEVER use this. |
Key Concepts
- Parcel: A land unit — either owned or leased.
- Lease types: Cash rent, crop share, flex rent.
- Lease expiration: Critical to track — approaching expirations need proactive attention.
- Land payments: Rent, mortgage, property tax, insurance — each with due dates.
Usage Notes
- Lease expiration tracking is the highest-value query — always flag leases expiring within 6 months.
- Payment status (due/overdue) is critical — flag overdue payments immediately.
- Cost per acre analysis helps compare owned vs leased economics.
- Landlord contact info is private — never share outside admin/manager channels.
- When asked about "cash requirements" or "what do we owe", always use
with date filtering to get the COMPLETE picture./api/integration/payments/all - For financial planning questions, combine
with/api/integration/payments/all
for the full view./api/integration/finance/costs - Write operations: Always use authenticated endpoints for marking payments paid or renewing leases. Preview first when doing bulk operations.
- Bulk payment marking: When user says "mark all March payments paid", use the bulk-by-date endpoint rather than individual calls.