{"openapi":"3.1.0","info":{"title":"FreshCredit API","description":"REST API for the FreshCredit credit platform.\n\nAuthentication: send a JWT as `Authorization: Bearer <token>` or a static API key as `X-API-Key: <key>`. Mutation endpoints accept an `Idempotency-Key` header (unique UUID) to prevent duplicate operations (API-006).","contact":{"name":"FreshCredit API Support","email":"api@freshcredit.com"},"license":{"name":"MIT OR Apache-2.0"},"version":"1.0.0"},"servers":[{"url":"https://api.freshcredit.com/v1","description":"Production"},{"url":"https://api-staging.freshcredit.com/v1","description":"Staging"},{"url":"http://localhost:3000/v1","description":"Local Development"}],"paths":{"/.well-known/ucp":{"get":{"tags":["UCP"],"summary":"UCP provider metadata","description":"Public provider discovery document (DEMO-001). Served at the host root,\noutside the `/v1` namespace.","operationId":"get_ucp_provider_metadata","responses":{"200":{"description":"Provider metadata","content":{"application/json":{"schema":{"type":"object"},"example":{"base_url":"https://api.freshcredit.com","capabilities":["credit_reporting","identity_verification","payment_processing"],"name":"FreshCredit","provider_id":"freshcredit","supported_versions":["ucp/1.0"],"version":"1.0.0"}}}}}}},"/applications":{"get":{"tags":["Applications"],"summary":"List applications","description":"Lists applications for the authenticated consumer. Results are always\nscoped to the authenticated user; filter parameters narrow further.","operationId":"list_applications","parameters":[{"name":"consumer_id","in":"query","description":"Filter by consumer (must be the authenticated user)","required":false,"schema":{"type":"string"}},{"name":"provider_id","in":"query","description":"Filter by provider","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"offer_id","in":"query","description":"Filter by offer","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","description":"Filter by status","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum results to return","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"offset","in":"query","description":"Results to skip","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Applications list","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationResponse"}}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]},"post":{"tags":["Applications"],"summary":"Create a new application","description":"Creates a credit application for the authenticated consumer against a\nprovider offer. Supports the `Idempotency-Key` header (API-006).","operationId":"create_application","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApplicationRequest"}}},"required":true},"responses":{"201":{"description":"Application created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/applications/{application_id}":{"get":{"tags":["Applications"],"summary":"Get an application by ID","description":"Returns a single application owned by the authenticated consumer.","operationId":"get_application","parameters":[{"name":"application_id","in":"path","description":"Application identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Application found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Application not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]},"put":{"tags":["Applications"],"summary":"Update an application","description":"Replaces application data and/or notes. Supports the `Idempotency-Key`\nheader (API-006).","operationId":"update_application","parameters":[{"name":"application_id","in":"path","description":"Application identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApplicationRequest"}}},"required":true},"responses":{"200":{"description":"Application updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Application not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/applications/{application_id}/history":{"get":{"tags":["Applications"],"summary":"Get an application's status history","description":"Returns the ordered audit trail of status transitions.","operationId":"get_status_history","parameters":[{"name":"application_id","in":"path","description":"Application identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Status history","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusHistoryResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Application not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/applications/{application_id}/status":{"put":{"tags":["Applications"],"summary":"Transition an application's status (GAP-002)","description":"Moves an application through its lifecycle (`draft` → `submitted` →\n`under_review` → `approved`/`rejected`, etc.). Supports the\n`Idempotency-Key` header (API-006).","operationId":"update_application_status","parameters":[{"name":"application_id","in":"path","description":"Application identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApplicationStatusRequest"}}},"required":true},"responses":{"200":{"description":"Status updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationResponse"}}}},"400":{"description":"Invalid status transition","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Application not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/claims":{"get":{"tags":["Claims"],"summary":"List claims","description":"Lists claims with optional filters.","operationId":"list_claims","parameters":[{"name":"user_id","in":"query","description":"Filter by user","required":false,"schema":{"type":"string"}},{"name":"publication_id","in":"query","description":"Filter by publication","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by status","required":false,"schema":{"type":"string"}},{"name":"verification_level","in":"query","description":"Filter by verification level","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum results to return","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"offset","in":"query","description":"Results to skip","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Claims list","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClaimResponse"}}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]},"post":{"tags":["Claims"],"summary":"Create a claim","description":"Creates a claim on a publication (author, contributor, etc.).\nSupports the `Idempotency-Key` header (API-006).","operationId":"create_claim","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClaimRequest"}}},"required":true},"responses":{"201":{"description":"Claim created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/claims/{claim_id}":{"get":{"tags":["Claims"],"summary":"Get a claim by ID","operationId":"get_claim","parameters":[{"name":"claim_id","in":"path","description":"Claim identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Claim found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Claim not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]},"put":{"tags":["Claims"],"summary":"Update a claim","description":"Supports the `Idempotency-Key` header (API-006).","operationId":"update_claim","parameters":[{"name":"claim_id","in":"path","description":"Claim identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateClaimRequest"}}},"required":true},"responses":{"200":{"description":"Claim updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Claim not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]},"delete":{"tags":["Claims"],"summary":"Delete a claim","description":"Supports the `Idempotency-Key` header (API-006).","operationId":"delete_claim","parameters":[{"name":"claim_id","in":"path","description":"Claim identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Claim deleted"},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Claim not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/claims/{claim_id}/status":{"put":{"tags":["Claims"],"summary":"Transition a claim's status","description":"Supports the `Idempotency-Key` header (API-006).","operationId":"update_claim_status","parameters":[{"name":"claim_id","in":"path","description":"Claim identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateClaimStatusRequest"}}},"required":true},"responses":{"200":{"description":"Status updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResponse"}}}},"400":{"description":"Invalid status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Claim not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/health":{"get":{"tags":["Health"],"summary":"Health check endpoint","description":"Returns the current health status of the API service.\nThis endpoint is publicly accessible and does not require authentication.","operationId":"health_check","responses":{"200":{"description":"Service is healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"},"example":{"status":"healthy","timestamp":"2026-03-21T12:00:00Z","version":"1.0.0"}}}},"503":{"description":"Service is unhealthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"}}}}}}},"/kyc/create":{"post":{"tags":["KYC"],"summary":"Start a KYC verification","description":"Creates an identity verification session via Plaid.\nSupports the `Idempotency-Key` header (API-006).","operationId":"create_kyc_verification","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Verification created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/kyc/status/{verification_id}":{"get":{"tags":["KYC"],"summary":"Get a KYC verification's status","operationId":"get_kyc_status","parameters":[{"name":"verification_id","in":"path","description":"Verification identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Verification status","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Verification not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/payments/add":{"post":{"tags":["Payments"],"summary":"Add a payment method","description":"Attaches a Stripe or crypto funding source to a user. Supports the\n`Idempotency-Key` header (API-006).","operationId":"add_payment_method","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPaymentMethodRequest"}}},"required":true},"responses":{"200":{"description":"Payment method added","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/payments/calculate-fee":{"get":{"tags":["Payments"],"summary":"Calculate the processing fee for an amount","description":"Returns FreshCredit's tiered fee (1.5% under $10K, 1.25% $10K–$100K,\n1.0% above $100K) for a given amount in cents.","operationId":"calculate_fee","parameters":[{"name":"amount","in":"query","description":"Amount in cents","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Fee quote","content":{"application/json":{"schema":{"type":"object"},"example":{"amount_cents":5000,"fee_amount_cents":75,"fee_percentage":1.5,"net_amount_cents":4925}}}},"400":{"description":"Missing or invalid amount","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/payments/crypto/confirm":{"post":{"tags":["Payments"],"summary":"Confirm a signed crypto payment — **partial**","description":"Submits a wallet-signed transaction. PARTIAL: submission is currently\nsimulated; the returned `tx_hash` is not a real on-chain transaction.","operationId":"confirm_crypto_payment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmCryptoPaymentRequest"}}},"required":true},"responses":{"200":{"description":"Submission acknowledged (simulated — partial implementation)","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/payments/crypto/initiate":{"post":{"tags":["Payments"],"summary":"Initiate a crypto payment — **partial**","description":"Returns transaction data for the user to sign with their own wallet\n(COMPLIANCE §1: FreshCredit never holds custody). PARTIAL: the returned\ntransaction payload is currently a placeholder encoding, not a real\nUSDC transfer call.","operationId":"initiate_crypto_payment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateCryptoPaymentRequest"}}},"required":true},"responses":{"200":{"description":"Transaction to sign (placeholder payload — partial implementation)","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/payments/crypto/receipt/{tx_hash}":{"get":{"tags":["Payments"],"summary":"Verify an Arc settlement receipt","description":"Verifies that a settlement receipt exists on Arc for the transaction.\nReturns `verified: false` when the Arc integration is disabled.","operationId":"verify_arc_receipt","parameters":[{"name":"tx_hash","in":"path","description":"Transaction hash","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Receipt verification result","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/payments/crypto/receipt/{tx_hash}/details":{"get":{"tags":["Payments"],"summary":"Get Arc receipt details","description":"Returns the full settlement receipt recorded on Arc, when present.","operationId":"get_arc_receipt_details","parameters":[{"name":"tx_hash","in":"path","description":"Transaction hash","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Receipt details","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/payments/crypto/status/{tx_hash}":{"get":{"tags":["Payments"],"summary":"Get crypto payment status — **partial**","description":"PARTIAL: returns a static confirmation payload; on-chain status queries\nare not yet wired.","operationId":"get_crypto_payment_status","parameters":[{"name":"tx_hash","in":"path","description":"Transaction hash","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Payment status (static — partial implementation)","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/payments/methods/{method_id}/default":{"post":{"tags":["Payments"],"summary":"Set a payment method as default — **partial**","description":"PARTIAL: the handler acknowledges the request but does not yet persist\nthe default flag.","operationId":"set_default_payment_method","parameters":[{"name":"method_id","in":"path","description":"Payment method identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Default set (not yet persisted — partial implementation)","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/payments/methods/{method_id}/toggle":{"post":{"tags":["Payments"],"summary":"Toggle a payment method's active status — **partial**","description":"PARTIAL: the handler acknowledges the request but does not yet persist\nthe active flag.","operationId":"toggle_payment_method","parameters":[{"name":"method_id","in":"path","description":"Payment method identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Toggled (not yet persisted — partial implementation)","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/payments/process":{"post":{"tags":["Payments"],"summary":"Process a payment","description":"Charges a saved payment method through Stripe Connect with FreshCredit's\ntiered fee structure. Supports the `Idempotency-Key` header (API-006).","operationId":"process_payment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessPaymentRequest"}}},"required":true},"responses":{"200":{"description":"Payment processed","content":{"application/json":{"schema":{"type":"object"},"example":{"amount_cents":5000,"payment_id":42,"processed_at":"2026-03-21T12:00:00Z","status":"Completed","transaction_id":"txn_1A2B3C"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"502":{"description":"Stripe operation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/plaid/accounts/{user_id}":{"get":{"tags":["Plaid"],"summary":"Get a user's linked bank accounts","operationId":"get_accounts","parameters":[{"name":"user_id","in":"path","description":"User identifier","required":true,"schema":{"type":"string"}},{"name":"access_token","in":"query","description":"Plaid access token override","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Linked accounts","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No linked item found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/plaid/exchange":{"post":{"tags":["Plaid"],"summary":"Exchange a Plaid public token","description":"Exchanges the public token from a completed Plaid Link flow for an\naccess token stored against the user.","operationId":"exchange_public_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeTokenRequest"}}},"required":true},"responses":{"200":{"description":"Token exchanged","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/plaid/link-token":{"post":{"tags":["Plaid"],"summary":"Create a Plaid Link token","description":"Creates a Link token to initialize Plaid Link for a user.","operationId":"create_link_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkTokenRequest"}}},"required":true},"responses":{"200":{"description":"Link token created","content":{"application/json":{"schema":{"type":"object"},"example":{"expiration":"2026-03-21T16:00:00Z","link_token":"link-sandbox-xxxxxxxx"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/plaid/transactions/{user_id}":{"get":{"tags":["Plaid"],"summary":"Get a user's bank transactions","operationId":"get_transactions","parameters":[{"name":"user_id","in":"path","description":"User identifier","required":true,"schema":{"type":"string"}},{"name":"access_token","in":"query","description":"Plaid access token override","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Transactions","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No linked item found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/provider-offers":{"get":{"tags":["Provider Offers"],"summary":"List provider offers","description":"Lists offers for a provider.","operationId":"list_provider_offers","parameters":[{"name":"provider_id","in":"query","description":"Provider whose offers to list","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Offers list","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProviderOfferResponse"}}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]},"post":{"tags":["Provider Offers"],"summary":"Create a provider offer","description":"Creates a new offer owned by a provider. Supports the `Idempotency-Key`\nheader (API-006).","operationId":"create_provider_offer","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProviderOfferRequest"}}},"required":true},"responses":{"201":{"description":"Offer created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderOfferResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/provider-offers/{offer_id}":{"get":{"tags":["Provider Offers"],"summary":"Get a provider offer by ID","operationId":"get_provider_offer","parameters":[{"name":"offer_id","in":"path","description":"Offer identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Offer found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderOfferResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Offer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]},"put":{"tags":["Provider Offers"],"summary":"Update a provider offer","description":"Supports the `Idempotency-Key` header (API-006).","operationId":"update_provider_offer","parameters":[{"name":"offer_id","in":"path","description":"Offer identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProviderOfferRequest"}}},"required":true},"responses":{"200":{"description":"Offer updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderOfferResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Offer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]},"delete":{"tags":["Provider Offers"],"summary":"Delete (deactivate) a provider offer","description":"Supports the `Idempotency-Key` header (API-006).","operationId":"delete_provider_offer","parameters":[{"name":"offer_id","in":"path","description":"Offer identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Offer deleted"},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Offer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/staging/approve-all":{"post":{"tags":["Staging"],"summary":"Approve all staged items for the authenticated user","description":"Supports the `Idempotency-Key` header (API-006).","operationId":"approve_all","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StagingApprovalRequest"}}},"required":true},"responses":{"200":{"description":"All staged items approved","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required or user mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/staging/approve/{item_id}":{"post":{"tags":["Staging"],"summary":"Approve a staged data item","description":"Moves one staged item to permanent storage. The `user_id` in the body\nmust match the authenticated user. Supports the `Idempotency-Key`\nheader (API-006).","operationId":"approve_item","parameters":[{"name":"item_id","in":"path","description":"Staging item identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StagingApprovalRequest"}}},"required":true},"responses":{"200":{"description":"Item approved","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required or user mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Staging item not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/staging/reject-all":{"post":{"tags":["Staging"],"summary":"Reject all staged items for the authenticated user","description":"Supports the `Idempotency-Key` header (API-006).","operationId":"reject_all","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StagingApprovalRequest"}}},"required":true},"responses":{"200":{"description":"All staged items rejected","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required or user mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/staging/reject/{item_id}":{"post":{"tags":["Staging"],"summary":"Reject a staged data item","description":"Prevents one staged item from moving to permanent storage. Supports the\n`Idempotency-Key` header (API-006).","operationId":"reject_item","parameters":[{"name":"item_id","in":"path","description":"Staging item identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StagingApprovalRequest"}}},"required":true},"responses":{"200":{"description":"Item rejected","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required or user mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Staging item not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/ucp/catalog/items":{"get":{"tags":["UCP"],"summary":"UCP catalog items","description":"Lists catalog items available through the UCP marketplace.","operationId":"get_ucp_catalog_items","responses":{"200":{"description":"Catalog items","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/user/{user_id}/payment-methods":{"get":{"tags":["Payments"],"summary":"List a user's payment methods — **partial**","description":"PARTIAL: the handler currently returns an empty structure; the unified\nStripe + crypto wallet listing is not yet wired to storage.","operationId":"get_user_payment_methods","parameters":[{"name":"user_id","in":"path","description":"User identifier (must be the authenticated user)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Payment methods (currently empty — partial implementation)","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/wallet/balance/{wallet_id}":{"get":{"tags":["Wallets"],"summary":"Get wallet balance","operationId":"get_wallet_balance","parameters":[{"name":"wallet_id","in":"path","description":"Wallet identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Wallet balance","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/wallet/connect/circle":{"post":{"tags":["Wallets"],"summary":"Create a Circle wallet","description":"Provisions a Circle-custodied wallet for the user.","operationId":"create_circle_wallet","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Circle wallet created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/wallet/connect/walletconnect":{"post":{"tags":["Wallets"],"summary":"Connect a wallet via WalletConnect","description":"Registers a user-controlled WalletConnect wallet reference.","operationId":"init_walletconnect","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Wallet connected","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/wallet/default/{wallet_id}":{"post":{"tags":["Wallets"],"summary":"Set a wallet as the user's default","operationId":"set_default_wallet","parameters":[{"name":"wallet_id","in":"path","description":"Wallet identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Default wallet set","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/wallet/disconnect/{wallet_id}":{"delete":{"tags":["Wallets"],"summary":"Disconnect a wallet","description":"Removes the wallet reference (no custody is held, so no funds move).","operationId":"disconnect_wallet","parameters":[{"name":"wallet_id","in":"path","description":"Wallet identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Wallet disconnected"},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/wallet/list/{user_id}":{"get":{"tags":["Wallets"],"summary":"List a user's wallets","operationId":"list_user_wallets","parameters":[{"name":"user_id","in":"path","description":"User identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Wallet list","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}},"/wallet/status/{wallet_id}":{"get":{"tags":["Wallets"],"summary":"Get wallet status","operationId":"get_wallet_status","parameters":[{"name":"wallet_id","in":"path","description":"Wallet identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Wallet status","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Wallet not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"security":[{"bearer_auth":[]},{"api_key":[]}]}}},"components":{"schemas":{"AddPaymentMethodRequest":{"type":"object","description":"Request to add a payment method","required":["user_id","account_id","processor_type"],"properties":{"account_id":{"type":"string","description":"External account identifier (e.g. Stripe token/account id)"},"processor_type":{"type":"string","description":"Payment processor (`stripe` or `crypto`)","example":"stripe"},"user_id":{"type":"integer","format":"int64","description":"User adding the payment method — must match the authenticated user"}}},"ApiError":{"type":"object","description":"Standard API error response","required":["error","message","code"],"properties":{"code":{"type":"string","description":"Machine-readable error code","example":"E001"},"error":{"type":"string","description":"Error type identifier","example":"validation_error"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email format"},"request_id":{"type":["string","null"],"description":"Request ID for tracking","example":"550e8400-e29b-41d4-a716-446655440000"}},"example":{"code":"E001","error":"validation_error","message":"Invalid email format","request_id":"550e8400-e29b-41d4-a716-446655440000"}},"ApplicationResponse":{"type":"object","description":"A credit application","required":["id","consumer_id","offer_id","provider_id","status","created_at","updated_at"],"properties":{"application_data":{"description":"Free-form application payload"},"consumer_id":{"type":"string","description":"Consumer (end user) identifier"},"created_at":{"type":"string","description":"Creation timestamp (RFC 3339)"},"id":{"type":"string","description":"Application identifier (UUID)"},"notes":{"type":["string","null"],"description":"Free-form notes"},"offer_id":{"type":"integer","format":"int64","description":"Provider offer identifier"},"provider_id":{"type":"integer","format":"int64","description":"Provider identifier"},"reviewed_at":{"type":["string","null"],"description":"Review timestamp (RFC 3339)"},"reviewed_by":{"type":["string","null"],"description":"Reviewer identifier"},"status":{"type":"string","description":"Current status","example":"draft"},"status_reason":{"type":["string","null"],"description":"Reason attached to the current status"},"submitted_at":{"type":["string","null"],"description":"Submission timestamp (RFC 3339)"},"updated_at":{"type":"string","description":"Last update timestamp (RFC 3339)"}}},"ClaimResponse":{"type":"object","description":"A claim on a publication","required":["id","user_id","publication_id","claim_type","status","verification_level","visibility","evidence","created_at","updated_at"],"properties":{"approved_at":{"type":["string","null"],"description":"Approval timestamp (RFC 3339)"},"claim_type":{"type":"string","description":"Claim type"},"created_at":{"type":"string","description":"Creation timestamp (RFC 3339)"},"evidence":{"type":"array","items":{"type":"string"},"description":"Supporting evidence"},"id":{"type":"string","description":"Claim identifier"},"notes":{"type":["string","null"],"description":"Free-form notes"},"publication_id":{"type":"string","description":"Publication identifier"},"revoked_at":{"type":["string","null"],"description":"Revocation timestamp (RFC 3339)"},"status":{"type":"string","description":"Current status","example":"pending"},"updated_at":{"type":"string","description":"Last update timestamp (RFC 3339)"},"user_id":{"type":"string","description":"Owning user identifier"},"verification_level":{"type":"string","description":"Verification level"},"visibility":{"type":"string","description":"Visibility setting"}}},"ConfirmCryptoPaymentRequest":{"type":"object","description":"Request to confirm a signed crypto payment (partial implementation)","required":["payment_id","signed_transaction"],"properties":{"network":{"type":["string","null"],"description":"Target network (defaults to `arc`)"},"payment_id":{"type":"string","description":"Payment identifier returned by the initiate step"},"signed_transaction":{"type":"string","description":"Wallet-signed transaction payload"}}},"CreateApplicationRequest":{"type":"object","description":"Request to create a credit application","required":["consumer_id","offer_id","provider_id"],"properties":{"application_data":{"description":"Free-form application payload (income, employment, etc.)"},"consumer_id":{"type":"string","description":"Consumer (end user) identifier — must match the authenticated user"},"initial_status":{"type":["string","null"],"description":"Initial status (defaults to `draft`)"},"offer_id":{"type":"integer","format":"int64","description":"Provider offer being applied to"},"provider_id":{"type":"integer","format":"int64","description":"Provider that owns the offer"}}},"CreateClaimRequest":{"type":"object","description":"Request to create a claim on a publication","required":["user_id","publication_id","claim_type"],"properties":{"claim_type":{"type":"string","description":"Claim type (e.g. `author`, `contributor`)","example":"author"},"evidence":{"type":["array","null"],"items":{"type":"string"},"description":"Supporting evidence URLs/documents"},"notes":{"type":["string","null"],"description":"Free-form notes"},"publication_id":{"type":"string","description":"Publication identifier (DOI, ORCID work id, etc.)"},"user_id":{"type":"string","description":"User making the claim"},"verification_level":{"type":["string","null"],"description":"Initial verification level"},"visibility":{"type":["string","null"],"description":"Visibility setting (`private`, `conditional`, `shared`)"}}},"CreateLinkTokenRequest":{"type":"object","description":"Request to create a Plaid Link token","required":["user_id"],"properties":{"user_id":{"type":"string","description":"User to create the Link token for"}}},"CreateProviderOfferRequest":{"type":"object","description":"Request to create a provider offer (BlockIQ offer matching)","required":["provider_id","name","product_type"],"properties":{"ab_test_allocation":{"type":["integer","null"],"format":"int32","description":"A/B test allocation percentage"},"ab_test_variant":{"type":["string","null"],"description":"A/B test variant name"},"apr_max_percent":{"type":["number","null"],"format":"double","description":"Maximum APR (percent)"},"apr_min_percent":{"type":["number","null"],"format":"double","description":"Minimum APR (percent)"},"blockscore_model_id":{"type":["integer","null"],"format":"int64","description":"`BlockScore` model used for targeting"},"customer_segment":{"type":["string","null"],"description":"Target customer segment"},"description":{"type":["string","null"],"description":"Offer description"},"excluded_states":{"type":["array","null"],"items":{"type":"string"},"description":"States where the offer is excluded"},"included_states":{"type":["array","null"],"items":{"type":"string"},"description":"States where the offer is available"},"loan_amount_max_cents":{"type":["integer","null"],"format":"int64","description":"Maximum loan amount in cents"},"loan_amount_min_cents":{"type":["integer","null"],"format":"int64","description":"Minimum loan amount in cents"},"name":{"type":"string","description":"Offer display name"},"nationwide":{"type":["boolean","null"],"description":"Whether the offer is available nationwide"},"product_type":{"type":"string","description":"Product type (e.g. `personal_loan`, `credit_card`)","example":"personal_loan"},"provider_id":{"type":"string","description":"Provider that owns the offer"},"term_options_months":{"type":["array","null"],"items":{"type":"integer","format":"int32"},"description":"Available term lengths in months"}}},"ExchangeTokenRequest":{"type":"object","description":"Request to exchange a Plaid public token","required":["public_token","user_id"],"properties":{"public_token":{"type":"string","description":"Public token returned by Plaid Link"},"user_id":{"type":"string","description":"User that completed Plaid Link"}}},"HealthStatus":{"type":"object","description":"Health check response","required":["status","version","timestamp"],"properties":{"status":{"type":"string","description":"Service health status","example":"healthy"},"timestamp":{"type":"string","format":"date-time","description":"Current timestamp"},"version":{"type":"string","description":"API version","example":"1.0.0"}},"example":{"status":"healthy","timestamp":"2026-03-21T12:00:00Z","version":"1.0.0"}},"InitiateCryptoPaymentRequest":{"type":"object","description":"Request to initiate a crypto payment (partial implementation)","required":["user_id","wallet_id","to_address","amount_usdc"],"properties":{"amount_usdc":{"type":"integer","format":"int64","description":"Amount in USDC smallest units","minimum":0},"description":{"type":["string","null"],"description":"Payment description"},"network":{"type":["string","null"],"description":"Target network (defaults to `arc`)"},"to_address":{"type":"string","description":"Destination blockchain address"},"user_id":{"type":"string","description":"User initiating the payment — must match the authenticated user"},"wallet_id":{"type":"string","description":"Source wallet identifier"}}},"PaginationParams":{"type":"object","description":"Pagination parameters","properties":{"limit":{"type":["integer","null"],"format":"int64","description":"Maximum number of results to return","default":20,"maximum":100,"minimum":1},"offset":{"type":["integer","null"],"format":"int64","description":"Number of results to skip","default":0,"minimum":0}}},"ProcessPaymentRequest":{"type":"object","description":"Request to process a payment via Stripe Connect","required":["user_id","amount_cents","payment_method_id"],"properties":{"amount_cents":{"type":"integer","format":"int64","description":"Amount in cents (must be positive)","example":5000},"currency":{"type":["string","null"],"description":"ISO currency code (defaults to `usd`)","example":"usd"},"description":{"type":["string","null"],"description":"Payment description"},"payment_method_id":{"type":"string","description":"Payment method to charge"},"provider_account_id":{"type":["string","null"],"description":"Stripe Connect destination account (marketplace payments)"},"user_id":{"type":"integer","format":"int64","description":"User making the payment — must match the authenticated user"}}},"ProviderOfferResponse":{"type":"object","description":"A provider offer","required":["id","provider_id","name","description","product_type","is_active","version"],"properties":{"created_at":{"type":["string","null"],"description":"Creation timestamp (RFC 3339)"},"description":{"type":"string","description":"Offer description"},"id":{"type":"string","description":"Offer identifier"},"is_active":{"type":"boolean","description":"Whether the offer is currently active"},"name":{"type":"string","description":"Offer display name"},"product_type":{"type":"string","description":"Product type","example":"PersonalLoan"},"provider_id":{"type":"string","description":"Owning provider identifier"},"updated_at":{"type":["string","null"],"description":"Last update timestamp (RFC 3339)"},"version":{"type":"integer","format":"int32","description":"Offer version number"}}},"StagingApprovalRequest":{"type":"object","description":"Request to approve/reject staged user data","required":["user_id"],"properties":{"user_id":{"type":"string","description":"User that owns the staged data — must match the authenticated user"}}},"StatusHistoryEntry":{"type":"object","description":"Single entry in an application's status history","required":["status","changed_by","changed_at"],"properties":{"changed_at":{"type":"string","description":"Transition timestamp (RFC 3339)"},"changed_by":{"type":"string","description":"Actor that performed the transition"},"reason":{"type":["string","null"],"description":"Reason for the transition"},"status":{"type":"string","description":"Status entered"}}},"StatusHistoryResponse":{"type":"object","description":"Status history for an application","required":["application_id","history"],"properties":{"application_id":{"type":"string","description":"Application identifier"},"history":{"type":"array","items":{"$ref":"#/components/schemas/StatusHistoryEntry"},"description":"Ordered status transitions"}}},"UpdateApplicationRequest":{"type":"object","description":"Request to update an application's data/notes","required":["updated_by"],"properties":{"application_data":{"description":"Replacement application payload"},"notes":{"type":["string","null"],"description":"Free-form notes"},"updated_by":{"type":"string","description":"Actor performing the update"}}},"UpdateApplicationStatusRequest":{"type":"object","description":"Request to transition an application's status","required":["status","updated_by"],"properties":{"metadata":{"description":"Arbitrary transition metadata"},"reason":{"type":["string","null"],"description":"Reason for the transition"},"status":{"type":"string","description":"New status (`draft`, `submitted`, `under_review`, `pending_documents`,\n`approved`, `rejected`, `withdrawn`, `expired`)","example":"submitted"},"updated_by":{"type":"string","description":"Actor performing the transition"}}},"UpdateClaimRequest":{"type":"object","description":"Request to update a claim","properties":{"evidence":{"type":["array","null"],"items":{"type":"string"},"description":"Updated evidence list"},"notes":{"type":["string","null"],"description":"Updated notes"},"verification_level":{"type":["string","null"],"description":"Updated verification level"},"visibility":{"type":["string","null"],"description":"Updated visibility"}}},"UpdateClaimStatusRequest":{"type":"object","description":"Request to transition a claim's status","required":["status","updated_by"],"properties":{"reason":{"type":["string","null"],"description":"Reason for the transition"},"status":{"type":"string","description":"New status (`draft`, `pending`, `approved`, `revoked`, `disputed`)","example":"approved"},"updated_by":{"type":"string","description":"Actor performing the transition"}}}},"securitySchemes":{"api_key":{"type":"apiKey","in":"header","name":"X-API-Key"},"bearer_auth":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"Health","description":"Service health checks"},{"name":"Applications","description":"Credit application management"},{"name":"Provider Offers","description":"BlockIQ offer matching"},{"name":"Payments","description":"Payment processing (Stripe Connect primary, Arc receipts)"},{"name":"Claims","description":"Publication claim management"},{"name":"Plaid","description":"Banking data via Plaid"},{"name":"Wallets","description":"Crypto wallet connections (non-custodial)"},{"name":"Staging","description":"User data approval workflow"},{"name":"KYC","description":"Identity verification"},{"name":"UCP","description":"Universal Credit Protocol provider publishing"},{"name":"Auth","description":"Authentication and authorization"}]}