FactionDocs
API Reference

Extract Quote Info

Extract structured quote fields from a case body and attachments.

POST
/extract/quote

Authorization

bearerAuth
AuthorizationBearer <token>

OAuth2 client credentials flow. Token obtained from /oauth2/token on the auth host.

In: header

Header Parameters

X-Correlation-Id*string

Caller-supplied correlation ID. Propagated end-to-end and returned in responses and audit logs.

Idempotency-Key?string

Optional. If reused within 24 hours with the same payload, the cached response is returned. Reuse with a different payload yields 409.

Prefer?string

Set to 'respond-async' to receive a 202 Accepted with a job ID instead of a synchronous result.

Value in"respond-async"
Faction-Callback-Url?string

Optional webhook for async results. If provided, Faction calls back to this URL when the job completes. Retried up to 5 times with exponential backoff.

Formaturi

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://api.eu.faction.ai/v1/extract/quote" \  -H "X-Correlation-Id: 8f3c-b21" \  -H "Idempotency-Key: case-CRM-2026-04-29-00417-intent-v1" \  -H "Content-Type: application/json" \  -d '{    "case_id": "string",    "body": "string"  }'
{
  "case_id": "CRM-2026-04-29-00417",
  "line_items": [
    {
      "description": "SKF 6205-2RS bearing",
      "quantity": 50,
      "unit": "each",
      "confidence_score": 0.96,
      "source": {
        "document": "email_body",
        "line_text": "50 x SKF 6205-2RS bearings"
      }
    },
    {
      "description": "Gates B-section drive belt B72",
      "quantity": 20,
      "unit": "each",
      "confidence_score": 0.93,
      "source": {
        "document": "email_body",
        "line_text": "20 x Gates B-section drive belts (B72)"
      }
    }
  ],
  "delivery_requirements": {
    "ship_to_hint": "Birmingham depot",
    "requested_by": "2026-05-01",
    "urgency": "high",
    "confidence_score": 0.88
  },
  "special_conditions": [],
  "attachments_processed": []
}
{
  "job_id": "job_01JZP4XYZ123",
  "status_url": "/v1/jobs/job_01JZP4XYZ123",
  "status": "queued"
}
{
  "error_code": "MISSING_REQUIRED_FIELD",
  "message": "Field 'case_id' is required.",
  "correlation_id": "8f3c-b21",
  "request_id": "req_01JZP4..."
}
{
  "error_code": "EXPIRED_TOKEN",
  "message": "Bearer token expired at 2026-04-29T13:00:00Z.",
  "correlation_id": "8f3c-b21",
  "request_id": "req_01JZP4..."
}
{
  "error_code": "SCOPE_INSUFFICIENT",
  "message": "Token lacks scope 'extract.quote'.",
  "correlation_id": "8f3c-b21",
  "request_id": "req_01JZP4..."
}
{
  "error_code": "IDEMPOTENCY_KEY_CONFLICT",
  "message": "Idempotency key was previously used with a different request payload.",
  "correlation_id": "8f3c-b22",
  "request_id": "req_01JZP4..."
}
{
  "error_code": "EXTRACTION_PARTIAL_FAILURE",
  "message": "2 of 3 attachments processed; 1 was password-protected and skipped.",
  "correlation_id": "8f3c-b21",
  "request_id": "req_01JZP4...",
  "details": {
    "skipped_attachments": [
      {
        "filename": "rfq_v2.pdf",
        "reason": "password_protected"
      }
    ]
  }
}
{
  "error_code": "RATE_LIMITED",
  "message": "Per-tenant per-module rate limit exceeded.",
  "correlation_id": "8f3c-b21",
  "request_id": "req_01JZP4..."
}
{
  "error_code": "INTERNAL_ERROR",
  "message": "An unexpected error occurred.",
  "correlation_id": "8f3c-b21",
  "request_id": "req_01JZP4..."
}

Notes

  • Schema-aware. The extractor only returns fields defined in the tenant's quote_schema.
  • Multi-modal: handles email body, PDFs, spreadsheets, scanned documents (OCR), and images.
  • Per-field confidence scores and source pointers (document, page, bounding box, line text).
  • Partial-success responses (HTTP 422) return the result alongside the failure reason in details.
  • Default p50 latency targets: under 1.5 s (body only), under 4 s (PDF, < 5 pages), under 12 s (multi-page scan).
  • Payloads over 10 MB or scans should use the async pattern with Prefer: respond-async and optionally a Faction-Callback-Url.

On this page