{"name":"Luca","description":"Luca keeps the accounting record of payments made by AI agents. Agents declare an intent before paying and report what they paid; the other side of a payment reads, confirms or proposes changes to its label. Luca never moves or holds money.","version":"0.24.0","supportedInterfaces":[{"url":"https://sandbox.luca.network/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"provider":{"organization":"Luca","url":"https://luca.network"},"documentationUrl":"https://luca.network","capabilities":{"streaming":false,"pushNotifications":false,"extendedAgentCard":false},"securitySchemes":{"bearer":{"httpAuthSecurityScheme":{"scheme":"Bearer","description":"A Luca agent key (luca_agent_…) or a counterparty key (luca_cp_…), issued by the Luca customer"}}},"securityRequirements":[{"schemes":{"bearer":{"list":[]}}}],"defaultInputModes":["application/json"],"defaultOutputModes":["application/json"],"skills":[{"id":"record_intent","name":"Declare an intent before paying","description":"Declare what you are about to buy and why, before paying. Returns an intent ID, the mandate check and the expiry. Amounts are integers in the currency's minor unit. For an agent key.","tags":["payments","accounting","mandate"],"examples":["{\"skill\":\"record_intent\",\"input\":{\"purpose\":\"Market data for the weekly report\",\"mandate_id\":\"mdt_…\",\"expected_amount_minor\":1200,\"max_amount_minor\":1500,\"currency\":\"USD\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"check_payment","name":"Check a payment before paying","description":"Ask whether this payment is allowed: registration approved, an open intent that fits, within the mandate. Answers approve or decline with reasons. For an agent key.","tags":["payments","controls"],"examples":["{\"skill\":\"check_payment\",\"input\":{\"rail\":\"x402\",\"amount_minor\":1200,\"currency\":\"USDC\",\"intent_id\":\"int_…\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"record_settlement","name":"Report a payment","description":"Report a payment after it is made, for rails Luca does not read directly, naming the intent it settles. For an agent key.","tags":["payments","accounting"],"examples":["{\"skill\":\"record_settlement\",\"input\":{\"rail\":\"x402\",\"source_id\":\"0x…\",\"amount_minor\":1200,\"currency\":\"USDC\",\"occurred_at\":\"2026-10-20T16:00:00Z\",\"intent_id\":\"int_…\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"report_delivery","name":"Report what was delivered","description":"Report what the merchant confirmed, using the field names of the intent's terms. Differences are raised to your owner. For an agent key.","tags":["accounting","terms"],"examples":["{\"skill\":\"report_delivery\",\"input\":{\"intent_id\":\"int_…\",\"source\":\"merchant_confirmation\",\"fields\":{\"check_in\":\"2026-11-02\"}}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"cancel_intent","name":"Withdraw an intent","description":"Withdraw an intent you will not pay, and say why. For an agent key.","tags":["payments"],"examples":["{\"skill\":\"cancel_intent\",\"input\":{\"intent_id\":\"int_…\",\"reason\":\"The seller was out of stock\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"get_intent","name":"Check an intent","description":"The status of one of your intents and the payment it matched. For an agent key.","tags":["payments"],"examples":["{\"skill\":\"get_intent\",\"input\":{\"intent_id\":\"int_…\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"verify_record","name":"Verify a record's seal","description":"Check that a Luca record of one of your payments is intact and signed. For an agent key.","tags":["accounting","evidence"],"examples":["{\"skill\":\"verify_record\",\"input\":{\"record_id\":\"LR-…\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"my_exceptions","name":"My open exceptions","description":"Items about your payments that your owner or finance needs to look at. For an agent key.","tags":["controls"],"examples":["{\"skill\":\"my_exceptions\",\"input\":{}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"record_sale","name":"Record a sale","description":"For a selling company's own agent: what a payment it received was for, and the service period it covers (ASC 606 / IFRS 15), by the payment's own reference. For an agent key.","tags":["revenue","asc 606","ifrs 15"],"examples":["{\"skill\":\"record_sale\",\"input\":{\"payment_id\":\"0x…\",\"product\":\"data_access\",\"service_period\":{\"start\":\"2026-11-01\",\"duration\":\"P1M\"}}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"record_usage","name":"Record usage of prepaid credits","description":"For a selling company's own agent: credits a customer used, so the contract liability is released to revenue at the close. For an agent key.","tags":["revenue","credits"],"examples":["{\"skill\":\"record_usage\",\"input\":{\"customer\":\"0x…\",\"amount_minor\":2500,\"currency\":\"USDC\",\"occurred_at\":\"2026-10-20T16:00:00Z\",\"reference\":\"call-81723\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"get_label","name":"Get the label of a payment","description":"For the other side of a payment: the label both sides book it by, by label_id or by the payment's own reference (payment_id). Returns the shared fields, what to sign, both signatures, the state and the history. For a counterparty key.","tags":["labels","accounting","counterparty"],"examples":["{\"skill\":\"get_label\",\"input\":{\"payment_id\":\"0x…\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"list_labels","name":"List labels","description":"Labels of payments with you, newest first, optionally by state (offered, agreed, disputed, unresolved). For a counterparty key.","tags":["labels"],"examples":["{\"skill\":\"list_labels\",\"input\":{\"state\":\"offered\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"confirm_label","name":"Confirm a label","description":"Confirm the label as it stands, signing sign_this with the key your company registered (EdDSA, or ES256 as r||s; base64url). For a counterparty key.","tags":["labels","signature"],"examples":["{\"skill\":\"confirm_label\",\"input\":{\"label_id\":\"lbl_…\",\"shared_sha256\":\"…\",\"signature\":\"…\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"propose_change","name":"Propose a change to a label","description":"Propose a different product or tax treatment, with your reason. Without a signature, returns the label as it would be and what to sign; send again with the signature. For a counterparty key.","tags":["labels","signature"],"examples":["{\"skill\":\"propose_change\",\"input\":{\"label_id\":\"lbl_…\",\"changes\":{\"product\":\"data_access\"},\"reason\":\"We sell this as data access, not inference\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]}]}