appfolio-common-errors
A diagnostic tool for AppFolio Stack API integrations, specifically covering HTTP errors and property-management-specific validation issues.
Install
mkdir -p .claude/skills/appfolio-common-errors && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/19499" && unzip -o skill.zip -d .claude/skills/appfolio-common-errors && rm skill.zipInstalls to .claude/skills/appfolio-common-errors
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Diagnose and fix common AppFolio API integration errors.Key capabilities
- →Diagnose HTTP-level API failures
- →Classify errors into auth, rate limit, validation, or server categories
- →Verify portfolio base URL configurations
- →Implement exponential backoff for rate limit recovery
- →Validate required fields for work orders and tenant creation
How it works
The skill provides a classification function to map HTTP status codes to specific error categories and offers a diagnostic curl command to verify connectivity.
Inputs & outputs
When to use appfolio-common-errors
- →Troubleshoot 404 tenant lookup failures
- →Verify portfolio base URL configurations
- →Resolve 409 lease conflict errors
- →Debug 401 unauthorized credential issues
About this skill
AppFolio Common Errors
Overview
AppFolio's Stack API powers property management integrations for tenant screening, work orders, lease management, and accounting. Each portfolio operates under its own subdomain ({company}.appfolio.com), meaning a single integration may need to handle multiple base URLs. Errors commonly stem from authentication misconfiguration, incorrect base URLs per portfolio, and business logic violations like duplicate tenant records or conflicting lease dates. Tenant lookup failures (404) are the most frequent issue, typically caused by targeting the wrong portfolio subdomain. This reference covers HTTP-level failures, property-management-specific validation errors, and recovery patterns for the most frequently encountered issues.
Error Reference
| Code | Message | Cause | Fix |
|---|---|---|---|
401 | Unauthorized | Invalid or rotated client_id/secret pair | Regenerate credentials in AppFolio Stack partner portal |
403 | Forbidden | Account not approved as Stack partner | Complete partner application at appfolio.com/stack |
404 | Tenant not found | Wrong portfolio base URL or deleted tenant | Verify base URL is {company}.appfolio.com/api/v1 |
409 | Lease conflict | Overlapping lease dates for same unit | Check existing leases on unit before creating new one |
422 | Validation failed | Missing required fields on work order or tenant | Include all required fields: unit_id, description, priority |
429 | Too Many Requests | Exceeded 120 requests/minute limit | Implement exponential backoff starting at 1s delay |
500 | Internal Server Error | AppFolio platform issue | Retry after 30s; check status.appfolio.com |
503 | Service Unavailable | Maintenance window (typically weekends) | Retry with backoff; subscribe to maintenance calendar |
Error Handler
interface AppFolioError {
code: number;
message: string;
category: "auth" | "rate_limit" | "validation" | "server";
}
function classifyAppFolioError(status: number, body: string): AppFolioError {
if (status === 401 || status === 403) {
return { code: status, message: body, category: "auth" };
}
if (status === 429) {
return { code: 429, message: "Rate limit exceeded", category: "rate_limit" };
}
if (status === 404 || status === 409 || status === 422) {
return { code: status, message: body, category: "validation" };
}
return { code: status, message: body, category: "server" };
}
Debugging Guide
Authentication Errors
AppFolio uses HTTP Basic Auth with client_id:client_secret. Verify credentials are not URL-encoded. Each portfolio has its own base URL -- confirm you are targeting the correct {company}.appfolio.com subdomain. Credentials rotate on partner approval changes.
Rate Limit Errors
The Stack API enforces 120 requests/minute per API key. Batch tenant lookups instead of individual calls. Use Retry-After header value when present. Bulk endpoints (e.g., /properties?page=1&per_page=100) reduce call count significantly. Rate limits are per-key, not per-portfolio, so multi-portfolio integrations share the same budget.
Validation Errors
Work order creation requires unit_id, description, and priority. Tenant creation requires first_name, last_name, and email. Lease creation fails with 409 if dates overlap an existing active lease on the same unit -- query current leases first. Move-in and move-out dates must be valid ISO 8601 format. Unit IDs are portfolio-specific and cannot be reused across subdomains.
Error Handling
| Scenario | Pattern | Recovery |
|---|---|---|
| Tenant lookup returns 404 | Search by email before creating | Use /tenants?email= endpoint |
| Work order 422 | Missing priority field | Default to normal if unspecified |
| Lease date conflict | Overlapping active lease | End existing lease before creating new |
| Bulk import partial failure | Some records rejected | Parse error array, retry failed records only |
| Auth token expired mid-batch | 401 on subsequent calls | Re-authenticate and resume from last offset |
Quick Diagnostic
# Verify API connectivity and auth
curl -s -o /dev/null -w "%{http_code}" \
-u "${APPFOLIO_CLIENT_ID}:${APPFOLIO_CLIENT_SECRET}" \
"${APPFOLIO_BASE_URL}/api/v1/properties"
Resources
Next Steps
See appfolio-debug-bundle.
When not to use it
- →When the AppFolio platform status page indicates a known outage
- →When attempting to reuse unit IDs across different subdomains
Prerequisites
Limitations
- →Rate limits are enforced per API key, not per portfolio
- →Unit IDs are portfolio-specific and cannot be reused across subdomains
How it compares
Unlike generic debugging, this skill provides specific recovery patterns for property-management-specific validation errors and multi-portfolio base URL handling.
Compared to similar skills
appfolio-common-errors side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| appfolio-common-errors (this skill) | 0 | 10d | Review | Intermediate |
| juicebox-common-errors | 1 | 10d | Review | Beginner |
| fastapi-templates | 520 | 2mo | No flags | Intermediate |
| fastapi-pro | 79 | 3mo | No flags | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
juicebox-common-errors
jeremylongshore
Diagnose and fix Juicebox common errors. Use when encountering API errors, debugging integration issues, or troubleshooting Juicebox connection problems. Trigger with phrases like "juicebox error", "fix juicebox issue", "juicebox not working", "debug juicebox".
fastapi-templates
wshobson
Create production-ready FastAPI projects with async patterns, dependency injection, and comprehensive error handling. Use when building new FastAPI applications or setting up backend API projects.
fastapi-pro
sickn33
Build high-performance async APIs with FastAPI, SQLAlchemy 2.0, and Pydantic V2. Master microservices, WebSockets, and modern Python async patterns. Use PROACTIVELY for FastAPI development, async optimization, or API architecture.
sqlite-inspector
mikopbx
Проверка консистентности данных в SQLite баз данных MikoPBX после операций REST API. Использовать при валидации результатов API, отладке проблем с данными, проверке связей внешних ключей или инспектировании CDR записей для тестирования.
springboot-patterns
affaan-m
Spring Boot 架构模式、REST API 设计、分层服务、数据访问、缓存、异步处理和日志记录。适用于 Java Spring Boot 后端工作。
redis-inspect
civitai
Inspect Redis cache keys, values, and TTLs for debugging. Supports both main cache and system cache. Use for debugging cache issues, checking cached values, and monitoring cache state. Read-only by default.