{"components":{"schemas":{"Contact":{"properties":{"address":{"type":"string"},"email":{"type":"string"},"id":{"type":"string"},"legal_name":{"type":"string"},"reference":{"type":"string"}},"required":["id","legal_name","email"],"type":"object"},"ContactCreate":{"additionalProperties":false,"properties":{"address":{"type":"string"},"email":{"format":"email","type":"string"},"legal_name":{"type":"string"},"reference":{"type":"string"}},"required":["legal_name","email"],"type":"object"},"Error":{"properties":{"error":{"type":"string"}},"required":["error"],"type":"object"},"Event":{"properties":{"api_version":{"const":"1.0"},"data":{"properties":{"amount_atomic":{"description":"Native USDC atomic units (six decimals); pay exact amount including matching delta.","minimum":1,"type":"integer"},"invoice_id":{"type":"string"},"network":{"type":"string"},"number":{"type":"string"},"quoted_amount_atomic":{"description":"Native USDC atomic units (six decimals); pay exact amount including matching delta.","minimum":1,"type":"integer"},"request_id":{"type":"string"},"status":{"type":"string"},"tx_hash":{"type":["string","null"]},"verified_at":{"type":"integer"}},"required":[],"type":"object"},"id":{"type":"string"},"occurred_at":{"type":"integer"},"type":{"enum":["payment_request.created","invoice.issued","invoice.voided","payment.confirmed","invoice.paid"]}},"required":["id","api_version","type","occurred_at","data"],"type":"object"},"Invoice":{"properties":{"customer_id":{"type":"string"},"due_at":{"type":"integer"},"id":{"type":"string"},"issued_at":{"type":"integer"},"items":{"items":{"type":"object"},"type":"array"},"network":{"type":"string"},"number":{"type":"string"},"payment_atomic":{"description":"Native USDC atomic units (six decimals); pay exact amount including matching delta.","minimum":1,"type":"integer"},"receiver":{"type":"string"},"request_id":{"type":"string"},"status":{"type":"string"},"tax_atomic":{"type":"integer"},"total_atomic":{"description":"Native USDC atomic units (six decimals); pay exact amount including matching delta.","minimum":1,"type":"integer"}},"required":["id","request_id","status","payment_atomic"],"type":"object"},"InvoiceCreate":{"additionalProperties":false,"properties":{"accounting":{"description":"Existing dashboard accounting validation applies; see reference.","type":"object"},"customer_id":{"type":"string"},"customer_receipt_opt_in":{"const":false},"due_date":{"format":"date","type":"string"},"items":{"items":{"$ref":"#/components/schemas/Item"},"minItems":1,"type":"array"},"reminder_opt_in":{"const":false},"send_now":{"const":false},"tax_mode":{"type":"string"},"tax_notes":{"type":"string"},"tax_rate":{"type":"string"},"tax_usdc":{"type":"string"},"wallet_id":{"type":"string"}},"required":["customer_id","wallet_id","due_date","items"],"type":"object"},"Item":{"properties":{"description":{"type":"string"},"quantity":{"type":"string"},"unit_usdc":{"type":"string"}},"required":["description","quantity","unit_usdc"],"type":"object"},"Me":{"properties":{"api_version":{"const":"1.0"},"id":{"type":"string"},"plan":{"description":"Current plan, request/invoice quotas, api_key_limit and webhook_limit.","type":"object"},"wallets":{"items":{"properties":{"address":{"type":"string"},"id":{"type":"string"},"network":{"type":"string"}},"required":["id","network","address"],"type":"object"},"type":"array"}},"required":["id","plan","wallets"],"type":"object"},"Request":{"properties":{"amount_atomic":{"description":"Native USDC atomic units (six decimals); pay exact amount including matching delta.","minimum":1,"type":"integer"},"created_at":{"type":"integer"},"customer_label":{"type":"string"},"description":{"type":"string"},"expected_payer":{"type":["string","null"]},"expires_at":{"type":"integer"},"id":{"type":"string"},"network":{"type":"string"},"quoted_amount_atomic":{"description":"Native USDC atomic units (six decimals); pay exact amount including matching delta.","minimum":1,"type":"integer"},"receiver_address":{"type":"string"},"status":{"type":"string"},"tx_hash":{"type":["string","null"]},"url":{"type":"string"},"verified_at":{"type":["integer","null"]},"wallet_id":{"type":"string"}},"required":["id","network","amount_atomic","status","url"],"type":"object"},"RequestCreate":{"additionalProperties":false,"properties":{"amount_usdc":{"example":"29.00","type":"string"},"customer_label":{"type":"string"},"description":{"maxLength":350,"minLength":3,"type":"string"},"expected_payer":{"type":"string"},"valid_hours":{"maximum":720,"minimum":1,"type":"integer"},"wallet_id":{"type":"string"}},"required":["wallet_id","amount_usdc","description"],"type":"object"},"SendApproval":{"additionalProperties":false,"properties":{"user_approved":{"const":true}},"required":["user_approved"],"type":"object"},"SendResult":{"properties":{"id":{"type":"string"},"mail_status":{"type":"string"}},"required":["id","mail_status"],"type":"object"}},"securitySchemes":{"PaymentProofBearer":{"description":"Payment Proof skp_ key only; read for GET, write for POST. No cookie fallback.","scheme":"bearer","type":"http"}}},"info":{"description":"Implementation reference; deployment and live E2E not claimed. Native USDC /30 days: Starter 9 (1 key/1 hook), Business 19 (3/3), Pro 29 (10/10); API/webhooks bundled. Seven-day trial 1/1. Generic Make/n8n/WooCommerce HTTP recipes, not official connectors. Mutations cannot confirm payments. Payment confirmation requires matching verified blockchain ledger evidence. Bearer read/write scopes; management uses dashboard cookie + CSRF. At-least-once signed delivery, durable dedup required; max five attempts. See /developers/reference.","title":"Skavio Payment Proof REST API","version":"1.0"},"openapi":"3.1.0","paths":{"/v1/contacts":{"get":{"parameters":[{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Opaque next_cursor; ID order, not chronological.","in":"query","name":"before","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Contact"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"type":"object"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Bounded tenant contacts","x-required-scope":"read"},"post":{"parameters":[{"description":"Persist per business operation. Identical replay returns original response; changed payload/operation returns 409. Tenant scoped, retained durably.","in":"header","name":"Idempotency-Key","required":true,"schema":{"pattern":"^[A-Za-z0-9_-]{16,80}$","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactCreate"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Create contact without automatic mail or payment","x-required-scope":"write"}},"/v1/events":{"get":{"parameters":[{"in":"query","name":"after","schema":{"default":0,"minimum":0,"type":"integer"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"properties":{"cursor":{"type":"integer"},"event":{"$ref":"#/components/schemas/Event"}},"required":[],"type":"object"},"type":"array"},"next_cursor":{"type":"integer"}},"required":[],"type":"object"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Retained event stream; not historical delivery replay","x-required-scope":"read"}},"/v1/invoices":{"get":{"parameters":[{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Opaque next_cursor; ID order, not chronological.","in":"query","name":"before","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Invoice"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"type":"object"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Bounded tenant invoices","x-required-scope":"read"},"post":{"parameters":[{"description":"Persist per business operation. Identical replay returns original response; changed payload/operation returns 409. Tenant scoped, retained durably.","in":"header","name":"Idempotency-Key","required":true,"schema":{"pattern":"^[A-Za-z0-9_-]{16,80}$","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceCreate"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Create invoice without automatic mail or payment","x-required-scope":"write"}},"/v1/invoices/{iid}":{"get":{"parameters":[{"in":"path","name":"iid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Get tenant invoice","x-required-scope":"read"}},"/v1/invoices/{iid}/send":{"post":{"parameters":[{"in":"path","name":"iid","required":true,"schema":{"type":"string"}},{"description":"Persist per business operation. Identical replay returns original response; changed payload/operation returns 409. Tenant scoped, retained durably.","in":"header","name":"Idempotency-Key","required":true,"schema":{"pattern":"^[A-Za-z0-9_-]{16,80}$","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendApproval"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendResult"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Queue email only after actual explicit user approval","x-required-scope":"write"}},"/v1/me":{"get":{"parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Account entitlements and verified receiving wallets","x-required-scope":"read"}},"/v1/requests":{"get":{"parameters":[{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Opaque next_cursor; ID order, not chronological.","in":"query","name":"before","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Request"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"type":"object"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Bounded tenant requests","x-required-scope":"read"},"post":{"parameters":[{"description":"Persist per business operation. Identical replay returns original response; changed payload/operation returns 409. Tenant scoped, retained durably.","in":"header","name":"Idempotency-Key","required":true,"schema":{"pattern":"^[A-Za-z0-9_-]{16,80}$","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCreate"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Create request without automatic mail or payment","x-required-scope":"write"}},"/v1/requests/{rid}":{"get":{"parameters":[{"in":"path","name":"rid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Request"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, inactive or insufficient scope key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Cross-site or customer-access denial"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or foreign resource"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Validation or quota failure"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Temporary service failure"}},"security":[{"PaymentProofBearer":[]}],"summary":"Get tenant request","x-required-scope":"read"}}},"servers":[{"description":"Intended public prefix; availability pending deployment","url":"https://www.skavio.eu/proof"}],"webhooks":{"proofEvent":{"post":{"parameters":[{"description":"Unix seconds; reject clock difference >300 seconds","in":"header","name":"X-Skavio-Timestamp","required":true,"schema":{"type":"string"}},{"description":"v1=<64 lowercase hex>; HMAC SHA256 of timestamp + dot + untouched body bytes","in":"header","name":"X-Skavio-Signature","required":true,"schema":{"type":"string"}},{"description":"Must match signed body id; durable deduplication key","in":"header","name":"X-Skavio-Event-Id","required":true,"schema":{"type":"string"}},{"description":"Stable delivery ID across retries","in":"header","name":"X-Skavio-Delivery-Id","required":true,"schema":{"type":"string"}},{"description":"Signing secret version","in":"header","name":"X-Skavio-Key-Version","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}},"required":true},"responses":{"204":{"description":"Return 2xx only after atomic durable dedup/business outbox commit; retries retain event/delivery IDs."}},"summary":"Signed event to registered public HTTPS endpoint; raw-byte HMAC verification required"}}}}
