# Resale Certificate Builder

> Prepare and check a resale certificate package, and see exactly what is missing, stale or contradictory before anyone signs it.

Human page: https://tools.rodri.ai/tools/resale-certificate
Skill: https://tools.rodri.ai/.well-known/skills/resale-certificate/SKILL.md
Category: operations
Exports: text, csv, print

## Operations

| Operation | Engine | Cost |
| --- | --- | --- |
| `resale_certificate.check` | deterministic | key required, no credit |
| `resale_certificate.draft` | deterministic | key required, no credit |

### `resale_certificate.check`

Check readiness. Needs an API key. Deterministic, and unlimited for a registered account.

Input schema version 1, output schema version 1.
MCP tool name: `resale_certificate_check`

Input JSON Schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "rulesetId": {
      "type": "string",
      "enum": [
        "unknown",
        "wa_wucioa",
        "wa_condominium_act"
      ]
    },
    "communityType": {
      "type": "string",
      "maxLength": 60
    },
    "transaction": {
      "type": "object",
      "properties": {
        "associationName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "propertyAddress": {
          "type": "string",
          "minLength": 1,
          "maxLength": 240
        },
        "unitNumber": {
          "type": "string",
          "maxLength": 40
        },
        "ownerName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "requestDate": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "requesterName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "requesterRole": {
          "type": "string",
          "maxLength": 80
        },
        "closingDate": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "responsibleManager": {
          "type": "string",
          "maxLength": 160
        },
        "internalReference": {
          "type": "string",
          "maxLength": 80
        }
      },
      "required": [
        "associationName",
        "propertyAddress",
        "ownerName",
        "requestDate",
        "requesterName"
      ]
    },
    "documents": {
      "default": [],
      "maxItems": 80,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "label": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "category": {
            "type": "string",
            "enum": [
              "governing",
              "financial",
              "reserves",
              "insurance",
              "governance",
              "unit",
              "legal"
            ]
          },
          "asOfDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
          },
          "superseded": {
            "default": false,
            "type": "boolean"
          },
          "unreadable": {
            "default": false,
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "label",
          "category"
        ]
      }
    },
    "answers": {
      "default": [],
      "maxItems": 200,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "state": {
            "type": "string",
            "enum": [
              "confirmed",
              "proposed",
              "conflicting",
              "missing",
              "stale",
              "requires_confirmation",
              "not_applicable",
              "records_unavailable"
            ]
          },
          "value": {
            "type": "string",
            "maxLength": 2000
          },
          "sourceType": {
            "default": "manual",
            "type": "string",
            "enum": [
              "manual",
              "document",
              "ai_proposed"
            ]
          },
          "evidenceDocumentId": {
            "type": "string",
            "maxLength": 80
          },
          "confirmedBy": {
            "type": "string",
            "maxLength": 120
          },
          "asOfDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
          },
          "note": {
            "type": "string",
            "maxLength": 500
          }
        },
        "required": [
          "code",
          "state"
        ]
      }
    },
    "overrides": {
      "default": [],
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "by": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          }
        },
        "required": [
          "code",
          "reason",
          "by"
        ]
      }
    },
    "attestations": {
      "default": {
        "reviewedAnswers": false,
        "authorizedOrRouting": false,
        "understandsNoLegalAdvice": false
      },
      "type": "object",
      "properties": {
        "reviewedAnswers": {
          "default": false,
          "type": "boolean"
        },
        "authorizedOrRouting": {
          "default": false,
          "type": "boolean"
        },
        "understandsNoLegalAdvice": {
          "default": false,
          "type": "boolean"
        },
        "reviewerName": {
          "type": "string",
          "maxLength": 120
        }
      }
    },
    "locale": {
      "default": "en",
      "type": "string",
      "enum": [
        "en",
        "es"
      ]
    }
  },
  "required": [
    "rulesetId",
    "transaction"
  ]
}
```

### `resale_certificate.draft`

Build the draft. Needs an API key. Deterministic, and unlimited for a registered account.

Input schema version 1, output schema version 1.
MCP tool name: `resale_certificate_draft`

Input JSON Schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "rulesetId": {
      "type": "string",
      "enum": [
        "unknown",
        "wa_wucioa",
        "wa_condominium_act"
      ]
    },
    "communityType": {
      "type": "string",
      "maxLength": 60
    },
    "transaction": {
      "type": "object",
      "properties": {
        "associationName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "propertyAddress": {
          "type": "string",
          "minLength": 1,
          "maxLength": 240
        },
        "unitNumber": {
          "type": "string",
          "maxLength": 40
        },
        "ownerName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "requestDate": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "requesterName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "requesterRole": {
          "type": "string",
          "maxLength": 80
        },
        "closingDate": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "responsibleManager": {
          "type": "string",
          "maxLength": 160
        },
        "internalReference": {
          "type": "string",
          "maxLength": 80
        }
      },
      "required": [
        "associationName",
        "propertyAddress",
        "ownerName",
        "requestDate",
        "requesterName"
      ]
    },
    "documents": {
      "default": [],
      "maxItems": 80,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "label": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "category": {
            "type": "string",
            "enum": [
              "governing",
              "financial",
              "reserves",
              "insurance",
              "governance",
              "unit",
              "legal"
            ]
          },
          "asOfDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
          },
          "superseded": {
            "default": false,
            "type": "boolean"
          },
          "unreadable": {
            "default": false,
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "label",
          "category"
        ]
      }
    },
    "answers": {
      "default": [],
      "maxItems": 200,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "state": {
            "type": "string",
            "enum": [
              "confirmed",
              "proposed",
              "conflicting",
              "missing",
              "stale",
              "requires_confirmation",
              "not_applicable",
              "records_unavailable"
            ]
          },
          "value": {
            "type": "string",
            "maxLength": 2000
          },
          "sourceType": {
            "default": "manual",
            "type": "string",
            "enum": [
              "manual",
              "document",
              "ai_proposed"
            ]
          },
          "evidenceDocumentId": {
            "type": "string",
            "maxLength": 80
          },
          "confirmedBy": {
            "type": "string",
            "maxLength": 120
          },
          "asOfDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
          },
          "note": {
            "type": "string",
            "maxLength": 500
          }
        },
        "required": [
          "code",
          "state"
        ]
      }
    },
    "overrides": {
      "default": [],
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "by": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          }
        },
        "required": [
          "code",
          "reason",
          "by"
        ]
      }
    },
    "attestations": {
      "default": {
        "reviewedAnswers": false,
        "authorizedOrRouting": false,
        "understandsNoLegalAdvice": false
      },
      "type": "object",
      "properties": {
        "reviewedAnswers": {
          "default": false,
          "type": "boolean"
        },
        "authorizedOrRouting": {
          "default": false,
          "type": "boolean"
        },
        "understandsNoLegalAdvice": {
          "default": false,
          "type": "boolean"
        },
        "reviewerName": {
          "type": "string",
          "maxLength": 120
        }
      }
    },
    "locale": {
      "default": "en",
      "type": "string",
      "enum": [
        "en",
        "es"
      ]
    }
  },
  "required": [
    "rulesetId",
    "transaction"
  ]
}
```

### Running an operation

Two ways in, and the difference is what an operation costs.

**No credential.** The four calculators are pure arithmetic — no model, nothing
stored, no allowance spent. Rate limited to 30 requests a minute per address.

```http
POST https://tools.rodri.ai/api/agent/tools/{toolId}/runs
Content-Type: application/json

{"operation": "meeting_quorum.calculate", "input": { ... }}
```

**With an API key.** Everything else, including every AI operation. The key's
owner creates it at https://tools.rodri.ai/account. It carries exactly their entitlements: a
free account has 20 AI credits a month and unlimited use of the calculators.
A key grants nothing its owner does not already have.

```http
POST https://tools.rodri.ai/api/agent/tools/{toolId}/runs
Authorization: Bearer hpt_live_…
Content-Type: application/json

{"operation": "resident_notice.generate", "input": { ... }}
```

Errors come back as `{"error": {"code", "message", "retryable"}}`. Branch on
`code` — `QUOTA_EXHAUSTED`, `RATE_LIMITED`, `REGISTRATION_REQUIRED`,
`VALIDATION_ERROR` — not on the sentence, which is written for people and is
translated.

**MCP.** The same operations are exposed at `https://tools.rodri.ai/api/mcp` over Streamable
HTTP. It is stateless, so POST JSON-RPC and read the JSON reply; the same
`Authorization` header applies.
