Skip to main content

API Terms and a new error code

Non-breaking changes to version 2026-10-05.

  • The API Terms, the Data Processing Agreement, the subprocessors and the privacy notice for Mexico are published. Opening an account asks you to accept the first two.
  • Accounts opened before today see a notice in the dashboard. Their live keys keep working without it until 2026-11-13. Test keys are not affected.
  • New error code: terms_not_accepted (403). A live call gets it when the account has not accepted the terms in force and their 30 days of grace are over.

Async estimates and webhooks

Non-breaking changes to version 2026-10-05. Nothing changes for a request that does not ask for the new features.

  • POST /v1/estimates and follow-ups accept mode: async. The answer is 202 with status: processing, and the estimate finishes in the background. See Async estimates.
  • An estimate can now have the status processing or failed, and a failed one carries error. Both happen only with mode: async.
  • Webhook endpoints receive signed events: estimate.completed, estimate.failed, credits.low, credits.exhausted, api_key.rotated, api_key.expiring, api_key.suspicious_activity and webhook.test. See Webhooks.
  • New operations: /v1/webhook_endpoints with test and secret rotation, and /v1/events with redelivery. They need the webhooks:manage scope, which every key made in the dashboard now carries, existing ones included.
  • New sandbox entries: sandbox:async and sandbox:failed.
  • New error codes: webhook_url_rejected, webhook_endpoint_limit and event_not_redeliverable.
  • Error codes and estimate statuses can grow. Handle an unknown error code by its HTTP status, and treat an unknown status as not finished.

The Records add-on

Non-breaking changes to version 2026-10-05. Accounts without the Records add-on see no change.

  • /v1/customers keeps your end customers, with phone and email stored encrypted. Each estimate can name one in customer_id, and GET /v1/customers/{id}/estimates lists them. See Records.
  • /v1/records/{collection}/{id} keeps any JSON object of up to 64 KB under your own id. The write with the latest updated_at_ms wins.
  • New scopes: customers:write, records:read and records:write. Keys gain them when the add-on is turned on.
  • An estimate linked to a customer answers with customer_id. Estimates without one answer as before.
  • New error code: records_cap_reached, past 50,000 customers and records in one environment.

Clearer steps, in English and Spanish

Non-breaking changes to version 2026-10-05. No field changes.

  • steps[].text comes in the language of locale when a translation exists. Spanish covers es, es-MX and es-ES, with numbers in the format of the country.
  • locale_fallback is en only when at least one line came back in English.
  • In English, steps[].text uses the plural of the unit and says "labor hours", as in "Rate: $72.00/hr, going rate for fence work". The figures do not change.
  • The four sandbox: answers with status 200 are now copies of what the estimator returned for real descriptions of these jobs.
  • tenant_suspended answers with the title "Account suspended", and model_unavailable with "Estimator unavailable". Read code, not title.
  • The contract declares the response headers and gives each operation a tag.
  • GET /v1 answers without a key, with the current version and links to the documentation and the contract.
  • Every error detail now says what to do next.

Version 2026-10-05

The first version of the Estimate API at https://api.wfskills.com/v1.

  • POST /v1/estimates prices a job from text, a conversation or up to four photos.
  • POST /v1/estimates/{id}/follow-up answers the question of an estimate with status needs_detail.
  • GET, DELETE and the list of estimates; GET /v1/tasks, /v1/regions, /v1/usage, /v1/balance and /v1/me.
  • Test keys answer eight sandbox inputs and spend no credits.