agentsclimarketplace

Appfolio common errors

Skill jeremylongshore/claude-code-plugins-plus-skills/plugins/saas-packs/appfolio-pack/skills/appfolio-common-errors

'Diagnose and fix common AppFolio API integration errors.From its SKILL.md

Install
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill appfolio-common-errors

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

What its file declares

Copied from the file, not written here

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

4.8 KB, ~1.0k tokens by cl100k_base, as published. Nobody here has run it

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

CodeMessageCauseFix
401UnauthorizedInvalid or rotated client_id/secret pairRegenerate credentials in AppFolio Stack partner portal
403ForbiddenAccount not approved as Stack partnerComplete partner application at appfolio.com/stack
404Tenant not foundWrong portfolio base URL or deleted tenantVerify base URL is {company}.appfolio.com/api/v1
409Lease conflictOverlapping lease dates for same unitCheck existing leases on unit before creating new one
422Validation failedMissing required fields on work order or tenantInclude all required fields: unit_id, description, priority
429Too Many RequestsExceeded 120 requests/minute limitImplement exponential backoff starting at 1s delay
500Internal Server ErrorAppFolio platform issueRetry after 30s; check status.appfolio.com
503Service UnavailableMaintenance 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

ScenarioPatternRecovery
Tenant lookup returns 404Search by email before creatingUse /tenants?email= endpoint
Work order 422Missing priority fieldDefault to normal if unspecified
Lease date conflictOverlapping active leaseEnd existing lease before creating new
Bulk import partial failureSome records rejectedParse error array, retry failed records only
Auth token expired mid-batch401 on subsequent callsRe-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.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 326,144. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.