← V1 docs
⚠ DRAFT — Partner API V2 is in active development and its shape is subject to change. Do not treat this as a finalized, stable API contract yet.

Partner API — V2

V2 replaces the async create/poll flow from V1 with a fully synchronous request/response model: POST a quote group and get the fully rated result back in the same response — no polling required.

Authentication

Every request must include an X-SwyfftApiKey header. A request without it, or with an invalid key, is rejected with a 401 unauthorized error (see Errors below).

Rater/CRM intermediary platforms (e.g. QuoteRush) that submit on behalf of multiple agencies additionally send an X-SwyfftIntermediaryKey header. When present and valid, it sets the request's channel (e.g. QuoteRush); an invalid key fails the request rather than silently downgrading. A request with no intermediary key is treated as Direct.

Quote group lifecycle

A quote group can also come back with no bindable quotes at all — a 200 response with an empty quotes array and an errors array explaining why each rating type declined.

Errors

Errors are returned as a single JSON envelope:

{
  "error": {
    "code": "invalid_request",
    "message": "Human-readable description",
    "param": "address",
    "requestId": "..."
  }
}

param is only present when the error is attributable to a specific request field. requestId is always present and also echoed as the X-Request-Id response header — include it when reporting an issue.

error.code is one of a fixed set of values; treat it as the stable part of the contract rather than the message text:

Rate limits

Rate limiting applies only to POST /partnerapi/v2/quote-groups (creating a new quote group) — reads and patches are not limited. The limit is checked before the get-or-create lookup, so every POST counts against it, including a repeat POST that returns an existing quote group rather than creating a new one. Default limits are 20 requests per rolling 5 minutes and 500 requests per rolling 24 hours per account; your account may have different limits configured.

Exceeding a limit returns 429 with error.code = "rate_limited" and a Retry-After header (in seconds) telling you when to try again.