Source: https://billingmart.com/developers/api/actions # Actions and approvals Anything that sends, moves money or changes the workspace is proposed here and waits for a signed-in person, or for the owner’s capped rule. [All sections](https://billingmart.com/developers/api) [Authentication](https://billingmart.com/developers/authentication) **On this page** - GET List - POST Propose - GET Get - POST Send invoice - POST Send estimate - POST Send reminder - POST Record payment - POST Receive payment - POST Charge saved method - POST Issue refund - POST Publish template - POST Resend receipt - POST Resend invoice email - POST Resend estimate - POST Attach bill document - POST Attach expense receipt - POST Add client contact - POST Set vendor contact - POST Issue credit note - POST Write off - POST Void invoice - POST Reopen void invoice - POST Void payment - POST Resolve unconfirmed payment - POST Record dispute - POST Resolve dispute - POST Mark payment returned - POST Settle payment - POST Record bill payment - POST Void bill - POST Void bill payment - POST Open bill - POST Create recurring - POST Update recurring - POST Resume recurring - POST Set autopay - POST Renew pay link - POST Revoke pay link - POST Merge clients - POST Rebill unbilled - POST Delete time entry - POST Delete expense - POST Delete mileage - POST Confirm tax category - POST Start card payment - POST Start ach payment - POST Send custom email - POST Send sms - POST Send client statement - POST Send payment link - POST Send verification invite - POST Publish pay theme - POST Update dunning cadence - POST Delete template draft - POST Delete pay theme draft - POST Setup gateway - POST Activate live gateway - POST Gateway self test - POST Create api key - POST Revoke api key - POST Register webhook - POST Rotate webhook secret - POST Invite member - POST Revoke invitation - POST Resend invitation - POST Update invitation email - POST Set member role - POST Remove member - POST Delete workspace - POST Cancel workspace deletion - POST Update branding - POST Update workspace settings - POST Update security settings - POST Update webhook - POST Delete webhook - POST Redeliver webhook - POST Register app client - POST Revoke app client - POST Disconnect app - POST Set member businesses - POST Create business - POST Update business - POST Set email settings - POST Set sms settings - POST Adopt business type - POST Apply catalogue changes - POST Update business type - POST Upload business logo - POST Create sandbox - POST Verify client contact - POST Plan change - POST Credit purchase - POST Activate job - POST Delete job - POST Attach job document - POST Apply work config - POST Send job link - POST Set job sharing - POST Create job link - POST Revoke job link - POST Issue job adjustment - POST Revise invoice - POST Void job adjustment - POST Create payment link - POST Update payment link - POST Enable payment link - POST Rotate payment link token - GET Wait - POST Withdraw On this page - GET List - POST Propose - GET Get - POST Send invoice - POST Send estimate - POST Send reminder - POST Record payment - POST Receive payment - POST Charge saved method - POST Issue refund - POST Publish template - POST Resend receipt - POST Resend invoice email - POST Resend estimate - POST Attach bill document - POST Attach expense receipt - POST Add client contact - POST Set vendor contact - POST Issue credit note - POST Write off - POST Void invoice - POST Reopen void invoice - POST Void payment - POST Resolve unconfirmed payment - POST Record dispute - POST Resolve dispute - POST Mark payment returned - POST Settle payment - POST Record bill payment - POST Void bill - POST Void bill payment - POST Open bill - POST Create recurring - POST Update recurring - POST Resume recurring - POST Set autopay - POST Renew pay link - POST Revoke pay link - POST Merge clients - POST Rebill unbilled - POST Delete time entry - POST Delete expense - POST Delete mileage - POST Confirm tax category - POST Start card payment - POST Start ach payment - POST Send custom email - POST Send sms - POST Send client statement - POST Send payment link - POST Send verification invite - POST Publish pay theme - POST Update dunning cadence - POST Delete template draft - POST Delete pay theme draft - POST Setup gateway - POST Activate live gateway - POST Gateway self test - POST Create api key - POST Revoke api key - POST Register webhook - POST Rotate webhook secret - POST Invite member - POST Revoke invitation - POST Resend invitation - POST Update invitation email - POST Set member role - POST Remove member - POST Delete workspace - POST Cancel workspace deletion - POST Update branding - POST Update workspace settings - POST Update security settings - POST Update webhook - POST Delete webhook - POST Redeliver webhook - POST Register app client - POST Revoke app client - POST Disconnect app - POST Set member businesses - POST Create business - POST Update business - POST Set email settings - POST Set sms settings - POST Adopt business type - POST Apply catalogue changes - POST Update business type - POST Upload business logo - POST Create sandbox - POST Verify client contact - POST Plan change - POST Credit purchase - POST Activate job - POST Delete job - POST Attach job document - POST Apply work config - POST Send job link - POST Set job sharing - POST Create job link - POST Revoke job link - POST Issue job adjustment - POST Revise invoice - POST Void job adjustment - POST Create payment link - POST Update payment link - POST Enable payment link - POST Rotate payment link token - GET Wait - POST Withdraw actions ## List GET `/v1/actions` Prepared actions proposed for this tenant and what happened to them. Scope `actions:read` Effect Read only MCP tool `list_pending_actions` Retries Safe to repeat ### Parameters List parameters | Name | In | Type | Notes | | --- | --- | --- | --- | | `limit`optional | query | `integer` | min 1 · max 50 | | `cursor`optional | query | `string` | up to 256 chars | | `status`optional | query | `enum` | One of `pending`, `approved`, `executed`, `rejected`, `expired`, `failed`, `withdrawn` | ### Returns `data`: `object[]`. Pass `meta.cursor` back as `cursor` for the next page. Example request Sample ``` curl -X GET "https://api.billingmart.com/v1/actions" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" ``` actions ## Propose POST `/v1/actions` Propose an action a verified person must approve in the console or a native app; nothing is sent or charged here. Scope `actions:propose` Effect Proposes an action a person approves MCP tool `propose_action` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Propose request body | Field | Type | Notes | | --- | --- | --- | | `kind`required | `enum` | One of 105 values | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `params`optional | `object` | — | | `params.recipientContactKey`optional | `string` | up to 128 chars | | `params.message`optional | `string` | up to 2000 chars | | `params.amount`optional | `object` | — | | `params.amount.minorUnits`required | `integer` | — | | `params.amount.currency`required | `Currency` | — | | `params.method`optional | `enum` | One of `cash`, `check`, `bankTransfer`, `other` | | `params.reference`optional | `string` | up to 128 chars | | `params.sendReceipt`optional | `boolean` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"kind":"","targetId":"","params":{"amount":{"minorUnits":0,"currency":"USD"}}}' ``` actions ## Get GET `/v1/actions/{actionId}` One prepared action. Scope `actions:read` Effect Read only MCP tool `get_action` Retries Safe to repeat ### Parameters Get parameters | Name | In | Type | Notes | | --- | --- | --- | --- | | `actionId`required | path | `id` | — | ### Returns `data`: `object` Example request Sample ``` curl -X GET "https://api.billingmart.com/v1/actions/{actionId}" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" ``` actions ## Send invoice POST `/v1/actions/sendInvoice` Request sendInvoice: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `send_invoice` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Send invoice request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/sendInvoice" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Send estimate POST `/v1/actions/sendEstimate` Request sendEstimate: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `send_estimate` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Send estimate request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/sendEstimate" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Send reminder POST `/v1/actions/sendReminder` Request sendReminder: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `send_reminder` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Send reminder request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `subject`optional | `string` | up to 200 chars · matches `^[^<]*$` | | `body`optional | `string` | up to 1600 chars · matches `^[^<]*$` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/sendReminder" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Record payment POST `/v1/actions/recordPayment` Request recordPayment: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `record_payment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Record payment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `amount`required | `object` | — | | `amount.minorUnits`required | `integer` | — | | `amount.currency`required | `Currency` | — | | `method`required | `enum` | One of `cash`, `check`, `bankTransfer`, `other` | | `reference`optional | `string` | up to 128 chars | | `receivedOn`optional | `string` | matches `^\d{4}-\d{2}-\d{2}$` | | `sendReceipt`optional | `boolean` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/recordPayment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","amount":{"minorUnits":0,"currency":"USD"},"method":"cash"}' ``` actions ## Receive payment POST `/v1/actions/receivePayment` Request receivePayment: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `receive_payment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Receive payment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `amount`required | `object` | — | | `amount.minorUnits`required | `integer` | — | | `amount.currency`required | `Currency` | — | | `method`required | `enum` | One of `cash`, `check`, `bankTransfer`, `other` | | `reference`optional | `string` | up to 128 chars | | `receivedOn`optional | `string` | matches `^\d{4}-\d{2}-\d{2}$` | | `allocations[]`optional | `object[]` | up to 100 items · at least 1 | | `allocations[].invoiceId`required | `id` | — | | `allocations[].amount`required | `object` | — | | `allocations[].amount.minorUnits`required | `integer` | — | | `allocations[].amount.currency`required | `Currency` | — | | `sendReceipt`optional | `boolean` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/receivePayment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","amount":{"minorUnits":0,"currency":"USD"},"method":"cash"}' ``` actions ## Charge saved method POST `/v1/actions/chargeSavedMethod` Request chargeSavedMethod: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `charge_saved_method` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Charge saved method request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/chargeSavedMethod" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Issue refund POST `/v1/actions/issueRefund` Request issueRefund: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `refund_payment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Issue refund request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `amount`optional | `object` | — | | `amount.minorUnits`required | `integer` | — | | `amount.currency`required | `Currency` | — | | `reason`optional | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/issueRefund" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","amount":{"minorUnits":0,"currency":"USD"}}' ``` actions ## Publish template POST `/v1/actions/publishTemplate` Request publishTemplate: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `publish_template` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Publish template request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/publishTemplate" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Resend receipt POST `/v1/actions/resendReceipt` Request resendReceipt: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `resend_receipt` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Resend receipt request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/resendReceipt" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Resend invoice email POST `/v1/actions/resendInvoiceEmail` Request resendInvoiceEmail: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `resend_invoice_email` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Resend invoice email request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/resendInvoiceEmail" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Resend estimate POST `/v1/actions/resendEstimate` Request resendEstimate: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `resend_estimate` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Resend estimate request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/resendEstimate" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Attach bill document POST `/v1/actions/attachBillDocument` Request attachBillDocument: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `attach_bill_document` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Attach bill document request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/attachBillDocument" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Attach expense receipt POST `/v1/actions/attachExpenseReceipt` Request attachExpenseReceipt: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `attach_expense_receipt` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Attach expense receipt request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/attachExpenseReceipt" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Add client contact POST `/v1/actions/addClientContact` Request addClientContact: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `request_client_contact` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Add client contact request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `contactKind`required | `enum` | One of `email`, `phone` | | `label`optional | `string` | up to 60 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/addClientContact" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","contactKind":"email"}' ``` actions ## Set vendor contact POST `/v1/actions/setVendorContact` Request setVendorContact: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `request_vendor_contact` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Set vendor contact request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `contactKind`required | `enum` | One of `email`, `phone` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/setVendorContact" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","contactKind":"email"}' ``` actions ## Issue credit note POST `/v1/actions/issueCreditNote` Request issueCreditNote: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `issue_credit_note` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Issue credit note request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `amount`required | `object` | — | | `amount.minorUnits`required | `integer` | — | | `amount.currency`required | `Currency` | — | | `reason`required | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/issueCreditNote" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","amount":{"minorUnits":0,"currency":"USD"},"reason":""}' ``` actions ## Write off POST `/v1/actions/writeOff` Request writeOff: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `write_off_invoice` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Write off request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `reason`required | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/writeOff" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","reason":""}' ``` actions ## Void invoice POST `/v1/actions/voidInvoice` Request voidInvoice: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `void_invoice` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Void invoice request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `reason`required | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/voidInvoice" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","reason":""}' ``` actions ## Reopen void invoice POST `/v1/actions/reopenVoidInvoice` Request reopenVoidInvoice: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `reopen_void_invoice` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Reopen void invoice request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/reopenVoidInvoice" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Void payment POST `/v1/actions/voidPayment` Request voidPayment: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `void_payment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Void payment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `reason`required | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/voidPayment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","reason":""}' ``` actions ## Resolve unconfirmed payment POST `/v1/actions/resolveUnconfirmedPayment` Request resolveUnconfirmedPayment: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `resolve_unconfirmed_payment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Resolve unconfirmed payment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `outcome`required | `enum` | One of `charged`, `notCharged`, `reversed`, `notReversed` | | `gatewayTransactionId`optional | `string` | matches `^[A-Za-z0-9-]{1,64}$` | | `note`optional | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/resolveUnconfirmedPayment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","outcome":"charged"}' ``` actions ## Record dispute POST `/v1/actions/recordDispute` Request recordDispute: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `record_dispute` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Record dispute request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `reason`required | `string` | up to 500 chars | | `reference`optional | `string` | matches `^[A-Za-z0-9._-]{1,64}$` | | `dueBy`optional | `string` | matches `^\d{4}-\d{2}-\d{2}$` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/recordDispute" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","reason":""}' ``` actions ## Resolve dispute POST `/v1/actions/resolveDispute` Request resolveDispute: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `resolve_dispute` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Resolve dispute request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `disputeOutcome`required | `enum` | One of `won`, `lost` | | `note`optional | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/resolveDispute" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","disputeOutcome":"won"}' ``` actions ## Mark payment returned POST `/v1/actions/markPaymentReturned` Request markPaymentReturned: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `mark_payment_returned` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Mark payment returned request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `reason`required | `string` | up to 500 chars | | `returnCode`optional | `string` | up to 16 chars | | `returnedOn`optional | `string` | matches `^\d{4}-\d{2}-\d{2}$` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/markPaymentReturned" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","reason":""}' ``` actions ## Settle payment POST `/v1/actions/settlePayment` Request settlePayment: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `settle_payment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Settle payment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `amount`optional | `object` | — | | `amount.minorUnits`required | `integer` | — | | `amount.currency`required | `Currency` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/settlePayment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","amount":{"minorUnits":0,"currency":"USD"}}' ``` actions ## Record bill payment POST `/v1/actions/recordBillPayment` Request recordBillPayment: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `record_bill_payment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Record bill payment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `amount`required | `object` | — | | `amount.minorUnits`required | `integer` | — | | `amount.currency`required | `Currency` | — | | `method`required | `enum` | One of `cash`, `check`, `bankTransfer`, `card`, `other` | | `reference`required | `string` | up to 128 chars | | `paidOn`optional | `string` | matches `^\d{4}-\d{2}-\d{2}$` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/recordBillPayment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","amount":{"minorUnits":0,"currency":"USD"},"method":"cash","reference":""}' ``` actions ## Void bill POST `/v1/actions/voidBill` Request voidBill: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `void_bill` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Void bill request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `reason`required | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/voidBill" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","reason":""}' ``` actions ## Void bill payment POST `/v1/actions/voidBillPayment` Request voidBillPayment: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `void_bill_payment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Void bill payment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `entryId`required | `id` | — | | `reason`required | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/voidBillPayment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","entryId":"","reason":""}' ``` actions ## Open bill POST `/v1/actions/openBill` Request openBill: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `open_bill` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Open bill request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/openBill" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Create recurring POST `/v1/actions/createRecurring` Request createRecurring: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `create_recurring` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Create recurring request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `businessId`required | `id` | — | | `title`optional | `string` | up to 200 chars | | `frequency`required | `enum` | One of `weekly`, `biweekly`, `monthly`, `quarterly`, `semiannually`, `annually` | | `startDate`required | `string` | matches `^\d{4}-\d{2}-\d{2}$` | | `endDate`optional | `string` | matches `^\d{4}-\d{2}-\d{2}$` | | `occurrenceLimit`optional | `integer` | min 1 · max 600 | | `netDays`optional | `integer` | min 0 · max 365 | | `currency`optional | `Currency` | — | | `language`optional | `string` | up to 8 chars | | `lineItems[]`required | `object[]` | up to 200 items · at least 1 | | `lineItems[].id`optional | `id` | — | | `lineItems[].description`optional | `string` | What the line is for. Optional with a presetKey (the item’s name is used). — up to 2000 chars | | `lineItems[].quantityMilli`optional | `integer` | Quantity in thousandths: 1000 is one unit, 1500 is 1.5 hours. Defaults to 1000. | | `lineItems[].rateBasis`optional | `enum` | How the price applies: fixed for one flat charge, hourly, daily, perUnit, percentage… Optional with a presetKey. — One of `fixed`, `hourly`, `daily`, `weekly`, `monthly`, `perUnit`, `perMile`, `perKilometre`, `percentage` | | `lineItems[].unitPrice`optional | `object` | Price per unit in integer minor units of the document currency ($5,000.00 is 500000). | | `lineItems[].unitPrice.minorUnits`required | `integer` | — | | `lineItems[].unitPrice.currency`required | `Currency` | — | | `lineItems[].rateBasisPoints`optional | `integer` | — | | `lineItems[].taxTreatment`optional | `string` | — | | `lineItems[].taxRateBasisPoints`optional | `integer` | — | | `lineItems[].discountBasisPoints`optional | `integer` | — | | `lineItems[].presetKey`optional | `string` | The key of one of the business’s products and services (get_business_context lists them); the server fills what the line leaves out. — up to 64 chars | | `missed`optional | `enum` | One of `skip`, `issue` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/createRecurring" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","businessId":"","frequency":"weekly","startDate":""}' ``` actions ## Update recurring POST `/v1/actions/updateRecurring` Request updateRecurring: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `update_recurring_schedule` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Update recurring request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `title`optional | `string` | up to 200 chars | | `lineItems[]`optional | `object[]` | up to 200 items · at least 1 | | `lineItems[].id`optional | `id` | — | | `lineItems[].description`optional | `string` | What the line is for. Optional with a presetKey (the item’s name is used). — up to 2000 chars | | `lineItems[].quantityMilli`optional | `integer` | Quantity in thousandths: 1000 is one unit, 1500 is 1.5 hours. Defaults to 1000. | | `lineItems[].rateBasis`optional | `enum` | How the price applies: fixed for one flat charge, hourly, daily, perUnit, percentage… Optional with a presetKey. — One of `fixed`, `hourly`, `daily`, `weekly`, `monthly`, `perUnit`, `perMile`, `perKilometre`, `percentage` | | `lineItems[].unitPrice`optional | `object` | Price per unit in integer minor units of the document currency ($5,000.00 is 500000). | | `lineItems[].unitPrice.minorUnits`required | `integer` | — | | `lineItems[].unitPrice.currency`required | `Currency` | — | | `lineItems[].rateBasisPoints`optional | `integer` | — | | `lineItems[].taxTreatment`optional | `string` | — | | `lineItems[].taxRateBasisPoints`optional | `integer` | — | | `lineItems[].discountBasisPoints`optional | `integer` | — | | `lineItems[].presetKey`optional | `string` | The key of one of the business’s products and services (get_business_context lists them); the server fills what the line leaves out. — up to 64 chars | | `netDays`optional | `integer` | min 0 · max 365 | | `endDate`optional | `string` | matches `^\d{4}-\d{2}-\d{2}$` | | `occurrenceLimit`optional | `integer` | min 1 · max 600 | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/updateRecurring" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Resume recurring POST `/v1/actions/resumeRecurring` Request resumeRecurring: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `resume_recurring` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Resume recurring request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `missed`optional | `enum` | One of `skip`, `issue` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/resumeRecurring" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Set autopay POST `/v1/actions/setAutopay` Request setAutopay: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `set_autopay` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Set autopay request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `enabled`required | `constant` | Always `false` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/setAutopay" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","enabled":""}' ``` actions ## Renew pay link POST `/v1/actions/renewPayLink` Request renewPayLink: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `renew_pay_link` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Renew pay link request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/renewPayLink" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Revoke pay link POST `/v1/actions/revokePayLink` Request revokePayLink: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `revoke_pay_link` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Revoke pay link request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/revokePayLink" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Merge clients POST `/v1/actions/mergeClients` Request mergeClients: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `merge_clients` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Merge clients request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `keepId`required | `id` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/mergeClients" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","keepId":""}' ``` actions ## Rebill unbilled POST `/v1/actions/rebillUnbilled` Request rebillUnbilled: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `rebill_unbilled` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Rebill unbilled request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `businessId`required | `id` | — | | `kinds`optional | `enum[]` | Each one of `timeEntry`, `expense`, `mileage` · up to 3 items · at least 1 | | `through`optional | `string` | matches `^\d{4}-\d{2}-\d{2}$` | | `invoiceId`optional | `id` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/rebillUnbilled" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","businessId":""}' ``` actions ## Delete time entry POST `/v1/actions/deleteTimeEntry` Request deleteTimeEntry: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `delete_time_entry` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Delete time entry request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/deleteTimeEntry" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Delete expense POST `/v1/actions/deleteExpense` Request deleteExpense: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `delete_expense` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Delete expense request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/deleteExpense" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Delete mileage POST `/v1/actions/deleteMileage` Request deleteMileage: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `delete_mileage` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Delete mileage request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/deleteMileage" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Confirm tax category POST `/v1/actions/confirmTaxCategory` Request confirmTaxCategory: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `confirm_tax_category` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Confirm tax category request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/confirmTaxCategory" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Start card payment POST `/v1/actions/startCardPayment` Request startCardPayment: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `start_card_payment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Start card payment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `amount`optional | `object` | — | | `amount.minorUnits`required | `integer` | — | | `amount.currency`required | `Currency` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/startCardPayment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","amount":{"minorUnits":0,"currency":"USD"}}' ``` actions ## Start ach payment POST `/v1/actions/startAchPayment` Request startAchPayment: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `start_ach_payment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Start ach payment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `amount`optional | `object` | — | | `amount.minorUnits`required | `integer` | — | | `amount.currency`required | `Currency` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/startAchPayment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","amount":{"minorUnits":0,"currency":"USD"}}' ``` actions ## Send custom email POST `/v1/actions/sendCustomEmail` Request sendCustomEmail: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `send_custom_email` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Send custom email request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `subject`required | `string` | up to 200 chars · matches `^[^<]*$` | | `body`required | `string` | up to 1600 chars · matches `^[^<]*$` | | `jobId`optional | `id` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/sendCustomEmail" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","subject":"","body":""}' ``` actions ## Send sms POST `/v1/actions/sendSms` Request sendSms: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `send_sms` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Send sms request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `text`required | `string` | up to 320 chars · matches `^[^<]*$` | | `jobId`optional | `id` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/sendSms" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","text":""}' ``` actions ## Send client statement POST `/v1/actions/sendClientStatement` Request sendClientStatement: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `send_client_statement` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Send client statement request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `periodFrom`required | `string` | matches `^\d{4}-\d{2}-\d{2}$` | | `periodTo`required | `string` | matches `^\d{4}-\d{2}-\d{2}$` | | `currency`required | `Currency` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/sendClientStatement" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","periodFrom":"","periodTo":"","currency":"USD"}' ``` actions ## Send payment link POST `/v1/actions/sendPaymentLink` Request sendPaymentLink: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `send_payment_link` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Send payment link request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `paymentLinkId`required | `id` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/sendPaymentLink" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","paymentLinkId":""}' ``` actions ## Send verification invite POST `/v1/actions/sendVerificationInvite` Request sendVerificationInvite: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `send_verification_invite` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Send verification invite request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `contactKey`required | `string` | matches `^(em\|ph)_[a-f0-9]{64}$` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/sendVerificationInvite" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","contactKey":""}' ``` actions ## Publish pay theme POST `/v1/actions/publishPayTheme` Request publishPayTheme: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `publish_pay_theme` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Publish pay theme request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/publishPayTheme" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Update dunning cadence POST `/v1/actions/updateDunningCadence` Request updateDunningCadence: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `update_dunning_cadence` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Update dunning cadence request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `cadence`required | `object` | — | | `cadence.offsetsDays`required | `integer[]` | up to 12 items · at least 1 | | `cadence.stopAfterDays`optional | `integer` | min 0 · max 730 | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/updateDunningCadence" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","cadence":{"offsetsDays":[]}}' ``` actions ## Delete template draft POST `/v1/actions/deleteTemplateDraft` Request deleteTemplateDraft: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `delete_template_draft` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Delete template draft request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/deleteTemplateDraft" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Delete pay theme draft POST `/v1/actions/deletePayThemeDraft` Request deletePayThemeDraft: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `delete_pay_theme_draft` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Delete pay theme draft request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/deletePayThemeDraft" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Setup gateway POST `/v1/actions/setupGateway` Request setupGateway: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `setup_gateway` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Setup gateway request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `environment`required | `enum` | One of `test`, `live` | | `liveEndpointHost`optional | `string` | up to 253 chars · matches `^[a-z0-9.-]+\.tranzpay\.com$` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/setupGateway" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"environment":"test"}' ``` actions ## Activate live gateway POST `/v1/actions/activateLiveGateway` Request activateLiveGateway: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `activate_live_gateway` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Activate live gateway request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/activateLiveGateway" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" ``` actions ## Gateway self test POST `/v1/actions/gatewaySelfTest` Request gatewaySelfTest: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `run_gateway_self_test` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Gateway self test request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `environment`required | `enum` | One of `test`, `live` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/gatewaySelfTest" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"environment":"test"}' ``` actions ## Create api key POST `/v1/actions/createApiKey` Request createApiKey: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `create_api_key` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Create api key request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `name`required | `string` | up to 120 chars | | `scopes`required | `string[]` | up to 64 items · at least 1 | | `environment`optional | `enum` | One of `live`, `test` | | `expiresAt`optional | `string (date-time)` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/createApiKey" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"name":"","scopes":[]}' ``` actions ## Revoke api key POST `/v1/actions/revokeApiKey` Request revokeApiKey: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `revoke_api_key` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Revoke api key request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/revokeApiKey" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Register webhook POST `/v1/actions/registerWebhook` Request registerWebhook: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `register_webhook_endpoint` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Register webhook request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `url`required | `string (starts_with)` | up to 2048 chars · matches `^https:\/\/.*` | | `events`required | `string[]` | up to 40 items · at least 1 | | `description`optional | `string` | up to 200 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/registerWebhook" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"url":"","events":[]}' ``` actions ## Rotate webhook secret POST `/v1/actions/rotateWebhookSecret` Request rotateWebhookSecret: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `rotate_webhook_secret` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Rotate webhook secret request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/rotateWebhookSecret" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Invite member POST `/v1/actions/inviteMember` Request inviteMember: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `invite_member` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Invite member request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `email`required | `string (email)` | up to 320 chars | | `role`required | `enum` | One of `admin`, `staff`, `viewer` | | `businessIds`optional | `id[]` | up to 50 items | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/inviteMember" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"email":"","role":"admin"}' ``` actions ## Revoke invitation POST `/v1/actions/revokeInvitation` Request revokeInvitation: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `revoke_invitation` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Revoke invitation request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/revokeInvitation" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Resend invitation POST `/v1/actions/resendInvitation` Request resendInvitation: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `resend_invitation` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Resend invitation request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/resendInvitation" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Update invitation email POST `/v1/actions/updateInvitationEmail` Request updateInvitationEmail: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `update_invitation_email` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Update invitation email request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `email`required | `string (email)` | up to 320 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/updateInvitationEmail" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","email":""}' ``` actions ## Set member role POST `/v1/actions/setMemberRole` Request setMemberRole: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `set_member_role` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Set member role request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `role`required | `enum` | One of `admin`, `staff`, `viewer` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/setMemberRole" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","role":"admin"}' ``` actions ## Remove member POST `/v1/actions/removeMember` Request removeMember: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `remove_member` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Remove member request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/removeMember" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Delete workspace POST `/v1/actions/deleteWorkspace` Request deleteWorkspace: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `delete_workspace` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Delete workspace request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/deleteWorkspace" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" ``` actions ## Cancel workspace deletion POST `/v1/actions/cancelWorkspaceDeletion` Request cancelWorkspaceDeletion: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `cancel_workspace_deletion` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Cancel workspace deletion request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/cancelWorkspaceDeletion" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" ``` actions ## Update branding POST `/v1/actions/updateBranding` Request updateBranding: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `update_branding` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Update branding request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `logoUrl`optional | `string (starts_with)` | up to 2048 chars · matches `^https:\/\/.*` | | `faviconUrl`optional | `string (starts_with)` | up to 2048 chars · matches `^https:\/\/.*` | | `tokenOverrides`optional | `object` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/updateBranding" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" ``` actions ## Update workspace settings POST `/v1/actions/updateWorkspaceSettings` Request updateWorkspaceSettings: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `update_workspace_settings` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Update workspace settings request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `name`optional | `string` | up to 120 chars | | `timeZone`optional | `string` | up to 64 chars | | `defaultCurrency`optional | `Currency` | — | | `defaultLanguage`optional | `string` | at least 2 chars · up to 8 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/updateWorkspaceSettings" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" ``` actions ## Update security settings POST `/v1/actions/updateSecuritySettings` Request updateSecuritySettings: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `update_security_settings` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Update security settings request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `mfaRequiredForAdmins`optional | `boolean` | — | | `emailRequiredForPortal`optional | `boolean` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/updateSecuritySettings" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" ``` actions ## Update webhook POST `/v1/actions/updateWebhook` Request updateWebhook: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `update_webhook_endpoint` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Update webhook request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `events`optional | `string[]` | up to 40 items · at least 1 | | `description`optional | `string` | up to 200 chars | | `active`optional | `boolean` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/updateWebhook" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Delete webhook POST `/v1/actions/deleteWebhook` Request deleteWebhook: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `delete_webhook_endpoint` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Delete webhook request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/deleteWebhook" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Redeliver webhook POST `/v1/actions/redeliverWebhook` Request redeliverWebhook: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `redeliver_webhook` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Redeliver webhook request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/redeliverWebhook" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Register app client POST `/v1/actions/registerAppClient` Request registerAppClient: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `register_app_client` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Register app client request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `clientName`required | `string` | up to 200 chars | | `redirectUris`required | `string (starts_with)[]` | up to 10 items · at least 1 | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/registerAppClient" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"clientName":"","redirectUris":[]}' ``` actions ## Revoke app client POST `/v1/actions/revokeAppClient` Request revokeAppClient: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `revoke_app_client` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Revoke app client request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/revokeAppClient" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Disconnect app POST `/v1/actions/disconnectApp` Request disconnectApp: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `disconnect_app` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Disconnect app request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/disconnectApp" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Set member businesses POST `/v1/actions/setMemberBusinesses` Request setMemberBusinesses: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `set_member_businesses` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Set member businesses request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `businessIds`required | `id[]` | up to 50 items | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/setMemberBusinesses" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","businessIds":[]}' ``` actions ## Create business POST `/v1/actions/createBusiness` Request createBusiness: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `create_business` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Create business request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `legalName`required | `string` | up to 200 chars | | `tradingName`optional | `string` | up to 200 chars | | `taxRegistrationId`optional | `string` | up to 64 chars | | `defaultCurrency`optional | `string` | at least 3 chars · up to 3 chars | | `defaultLanguage`optional | `string` | up to 8 chars | | `email`optional | `string` | up to 320 chars | | `phone`optional | `string` | up to 20 chars | | `numberFormat`optional | `string` | up to 64 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/createBusiness" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"legalName":""}' ``` actions ## Update business POST `/v1/actions/updateBusiness` Request updateBusiness: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `update_business` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Update business request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `legalName`optional | `string` | up to 200 chars | | `tradingName`optional | `string` | up to 200 chars | | `taxRegistrationId`optional | `string` | up to 64 chars | | `defaultCurrency`optional | `string` | at least 3 chars · up to 3 chars | | `defaultLanguage`optional | `string` | up to 8 chars | | `email`optional | `string` | up to 320 chars | | `phone`optional | `string` | up to 20 chars | | `numberFormat`optional | `string` | up to 64 chars | | `mileageDefaults`optional | `object` | — | | `mileageDefaults.distanceUnit`required | `enum` | One of `mile`, `kilometre` | | `mileageDefaults.ratePerUnit`required | `object` | — | | `mileageDefaults.ratePerUnit.minorUnits`required | `integer` | — | | `mileageDefaults.ratePerUnit.currency`required | `Currency` | — | | `timeDefaults`optional | `object` | — | | `timeDefaults.hourlyRate`required | `object` | — | | `timeDefaults.hourlyRate.minorUnits`required | `integer` | — | | `timeDefaults.hourlyRate.currency`required | `Currency` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/updateBusiness" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","mileageDefaults":{"distanceUnit":"mile","ratePerUnit":{"minorUnits":0,"currency":"USD"}},"timeDefaults":{"hourlyRate":{"minorUnits":0,"currency":"USD"}}}' ``` actions ## Set email settings POST `/v1/actions/setEmailSettings` Request setEmailSettings: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `set_email_settings` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Set email settings request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `enabled`required | `boolean` | — | | `fromName`optional | `string` | up to 60 chars | | `replyTo`optional | `string` | up to 320 chars | | `merchantNotifications`optional | `object` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/setEmailSettings" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"enabled":false}' ``` actions ## Set sms settings POST `/v1/actions/setSmsSettings` Request setSmsSettings: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `set_sms_settings` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Set sms settings request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `enabled`required | `boolean` | — | | `senderName`optional | `string` | up to 40 chars | | `notifications`optional | `object` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/setSmsSettings" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"enabled":false}' ``` actions ## Adopt business type POST `/v1/actions/adoptBusinessType` Request adoptBusinessType: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `adopt_business_type` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Adopt business type request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `key`required | `string` | matches `^[a-z][a-z0-9-]{0,63}$` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/adoptBusinessType" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","key":""}' ``` actions ## Apply catalogue changes POST `/v1/actions/applyCatalogueChanges` Request applyCatalogueChanges: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `apply_catalogue_changes` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Apply catalogue changes request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `accept`required | `string[]` | up to 200 items | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/applyCatalogueChanges" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","accept":[]}' ``` actions ## Update business type POST `/v1/actions/updateBusinessType` Request updateBusinessType: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `update_business_type` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Update business type request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `definition`required | `object` | — | | `definition.defaultTerms`optional | `object` | — | | `definition.defaultTerms.depositBasisPoints`optional | `integer` | min -10000000 · max 10000000 | | `definition.defaultTerms.installments`optional | `integer` | min 0 · max 60 | | `definition.defaultTerms.netDays`required | `integer` | min 0 · max 365 | | `definition.defaultTerms.notes`optional | `string` | up to 1000 chars | | `definition.defaultTerms.retainageBasisPoints`optional | `integer` | min -10000000 · max 10000000 | | `definition.dunningCadence`optional | `object` | — | | `definition.dunningCadence.offsetsDays`required | `integer[]` | — | | `definition.dunningCadence.stopAfterDays`optional | `integer` | min 0 · max 730 | | `definition.feeTypes[]`optional | `object[]` | — | | `definition.feeTypes[].defaultAmount`optional | `object` | — | | `definition.feeTypes[].defaultAmount.currency`required | `Currency` | — | | `definition.feeTypes[].defaultAmount.minorUnits`required | `integer` | — | | `definition.feeTypes[].defaultRateBasisPoints`optional | `integer` | min -10000000 · max 10000000 | | `definition.feeTypes[].key`required | `string` | up to 64 chars | | `definition.feeTypes[].label`required | `string` | up to 120 chars | | `definition.feeTypes[].taxTreatment`optional | `enum` | One of `taxable`, `exempt`, `zeroRated`, `reverseCharge` | | `definition.invoiceFields[]`optional | `object[]` | — | | `definition.invoiceFields[].helpText`optional | `string` | up to 300 chars | | `definition.invoiceFields[].key`required | `string` | up to 64 chars · matches `^[a-z][a-zA-Z0-9]*$` | | `definition.invoiceFields[].label`required | `string` | up to 120 chars | | `definition.invoiceFields[].options`optional | `string[]` | — | | `definition.invoiceFields[].printOnCustomerCopy`required | `boolean` | — | | `definition.invoiceFields[].required`required | `boolean` | — | | `definition.invoiceFields[].searchable`optional | `boolean` | — | | `definition.invoiceFields[].type`required | `enum` | One of `text`, `longText`, `integer`, `money`, `basisPoints`, `date`, `boolean`, `select` | | `definition.itemPresets[]`optional | `object[]` | — | | `definition.itemPresets[].defaultRateBasisPoints`optional | `integer` | min -10000000 · max 10000000 | | `definition.itemPresets[].defaultUnitPrice`optional | `object` | — | | `definition.itemPresets[].defaultUnitPrice.currency`required | `Currency` | — | | `definition.itemPresets[].defaultUnitPrice.minorUnits`required | `integer` | — | | `definition.itemPresets[].key`required | `string` | up to 64 chars | | `definition.itemPresets[].label`required | `string` | up to 120 chars | | `definition.itemPresets[].rateBasis`required | `enum` | One of `fixed`, `hourly`, `daily`, `weekly`, `monthly`, `perUnit`, `perMile`, `perKilometre`, `percentage` | | `definition.itemPresets[].taxTreatment`optional | `enum` | One of `taxable`, `exempt`, `zeroRated`, `reverseCharge` | | `definition.numberFormat`required | `string` | up to 64 chars | | `definition.taxProfile`optional | `object` | — | | `definition.taxProfile.defaultRateBasisPoints`optional | `integer` | min -10000000 · max 10000000 | | `definition.taxProfile.defaultTreatment`required | `enum` | One of `taxable`, `exempt`, `zeroRated`, `reverseCharge` | | `definition.taxProfile.perLineTax`optional | `boolean` | — | | `definition.taxProfile.taxLabel`optional | `string` | up to 60 chars | | `definition.terminology`required | `object` | — | | `definition.terminology.changeOrder`required | `string` | up to 60 chars | | `definition.terminology.client`optional | `string` | up to 60 chars | | `definition.terminology.estimate`optional | `string` | up to 60 chars | | `definition.terminology.invoice`optional | `string` | up to 60 chars | | `definition.terminology.job`required | `string` | up to 60 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/updateBusinessType" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","definition":{"defaultTerms":{"netDays":0},"dunningCadence":{"offsetsDays":[]},"numberFormat":"","taxProfile":{"defaultTreatment":"taxable"},"terminology":{"changeOrder":"","job":""}}}' ``` actions ## Upload business logo POST `/v1/actions/uploadBusinessLogo` Request uploadBusinessLogo: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `upload_business_logo` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Upload business logo request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/uploadBusinessLogo" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Create sandbox POST `/v1/actions/createSandbox` Request createSandbox: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `create_sandbox` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Create sandbox request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/createSandbox" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" ``` actions ## Verify client contact POST `/v1/actions/verifyClientContact` Request verifyClientContact: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `verify_client_contact` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Verify client contact request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `contactKey`required | `string` | matches `^(em\|ph)_[a-f0-9]{64}$` | | `reason`required | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/verifyClientContact" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","contactKey":"","reason":""}' ``` actions ## Plan change POST `/v1/actions/planChange` Request planChange: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `plan_change` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Plan change request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `planId`required | `id` | — | | `interval`optional | `enum` | One of `monthly`, `annual` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/planChange" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"planId":""}' ``` actions ## Credit purchase POST `/v1/actions/creditPurchase` Request creditPurchase: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `credit_purchase` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Credit purchase request body | Field | Type | Notes | | --- | --- | --- | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `packId`required | `string` | matches `^[A-Za-z0-9_-]{1,64}$` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/creditPurchase" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"packId":""}' ``` actions ## Activate job POST `/v1/actions/activateJob` Request activateJob: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `activate_job` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Activate job request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/activateJob" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Delete job POST `/v1/actions/deleteJob` Request deleteJob: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `delete_job` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Delete job request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `reason`required | `string` | up to 500 chars | | `voidInvoices`required | `boolean` | — | | `voidBills`required | `boolean` | — | | `discardEstimates`required | `boolean` | — | | `unlinkEntries`optional | `boolean` | — | | `withSubJobs`optional | `boolean` | — | | `planHash`required | `string` | matches `^[0-9a-f]{32}$` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/deleteJob" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","reason":"","voidInvoices":false,"voidBills":false,"discardEstimates":false,"planHash":""}' ``` actions ## Attach job document POST `/v1/actions/attachJobDocument` Request attachJobDocument: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `attach_job_document` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Attach job document request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/attachJobDocument" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Apply work config POST `/v1/actions/applyWorkConfig` Request applyWorkConfig: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:admin` Effect Proposes an action a person approves MCP tool `apply_work_config` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Apply work config request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `accept`optional | `string[]` | up to 400 items | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/applyWorkConfig" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Send job link POST `/v1/actions/sendJobLink` Request sendJobLink: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:deliver` Effect Proposes an action a person approves MCP tool `send_job_link` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Send job link request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `contactKey`required | `string` | matches `^(em\|ph)_[a-f0-9]{64}$` | | `channel`required | `enum` | One of `email`, `sms` | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/sendJobLink" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","contactKey":"","channel":"email"}' ``` actions ## Set job sharing POST `/v1/actions/setJobSharing` Request setJobSharing: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `set_job_sharing` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Set job sharing request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `sharing`required | `object` | — | | `sharing.documentOverrides`optional | `object` | — | | `sharing.payButtons`optional | `boolean` | — | | `sharing.portal`optional | `boolean` | — | | `sharing.publicLink`optional | `boolean` | — | | `sharing.showAdjustments`optional | `boolean` | — | | `sharing.showBills`optional | `boolean` | — | | `sharing.showDocuments`optional | `enum` | One of `none`, `selected`, `all` | | `sharing.showEstimates`optional | `boolean` | — | | `sharing.showFields`optional | `boolean` | — | | `sharing.showInvoices`optional | `boolean` | — | | `sharing.showNextStep`optional | `boolean` | — | | `sharing.showPayments`optional | `boolean` | — | | `sharing.showStage`optional | `boolean` | — | | `sharing.showSubJobs`optional | `boolean` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/setJobSharing" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","sharing":{}}' ``` actions ## Create job link POST `/v1/actions/createJobLink` Request createJobLink: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `create_job_link` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Create job link request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `expiryDays`optional | `constant` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/createJobLink" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Revoke job link POST `/v1/actions/revokeJobLink` Request revokeJobLink: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `revoke_job_link` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Revoke job link request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/revokeJobLink" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Issue job adjustment POST `/v1/actions/issueJobAdjustment` Request issueJobAdjustment: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `issue_job_adjustment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Issue job adjustment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `adjustmentId`required | `id` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/issueJobAdjustment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","adjustmentId":""}' ``` actions ## Revise invoice POST `/v1/actions/reviseInvoice` Request reviseInvoice: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `revise_invoice` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Revise invoice request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `expectedUpdatedAt`required | `string` | The invoice’s `updatedAt` as read: a revision never overwrites a newer change. — up to 64 chars | | `lineItems[]`required | `object[]` | up to 200 items · at least 1 | | `lineItems[].id`optional | `id` | — | | `lineItems[].description`optional | `string` | What the line is for. Optional with a presetKey (the item’s name is used). — up to 2000 chars | | `lineItems[].quantityMilli`optional | `integer` | Quantity in thousandths: 1000 is one unit, 1500 is 1.5 hours. Defaults to 1000. | | `lineItems[].rateBasis`optional | `enum` | How the price applies: fixed for one flat charge, hourly, daily, perUnit, percentage… Optional with a presetKey. — One of `fixed`, `hourly`, `daily`, `weekly`, `monthly`, `perUnit`, `perMile`, `perKilometre`, `percentage` | | `lineItems[].unitPrice`optional | `object` | Price per unit in integer minor units of the document currency ($5,000.00 is 500000). | | `lineItems[].unitPrice.minorUnits`required | `integer` | — | | `lineItems[].unitPrice.currency`required | `Currency` | — | | `lineItems[].rateBasisPoints`optional | `integer` | — | | `lineItems[].taxTreatment`optional | `string` | — | | `lineItems[].taxRateBasisPoints`optional | `integer` | — | | `lineItems[].discountBasisPoints`optional | `integer` | — | | `lineItems[].presetKey`optional | `string` | The key of one of the business’s products and services (get_business_context lists them); the server fills what the line leaves out. — up to 64 chars | | `issueDate`optional | `string` | matches `^\d{4}-\d{2}-\d{2}$` | | `dueDate`optional | `string` | matches `^\d{4}-\d{2}-\d{2}$` | | `terms`optional | `string` | up to 4000 chars | | `notes`optional | `string` | up to 4000 chars | | `poNumber`optional | `string` | up to 64 chars | | `customFields`optional | `object` | — | | `reason`optional | `string` | up to 500 chars | | `emailCustomer`required | `boolean` | — | | `dryRun`optional | `boolean` | Answer what the revision would do (totals, status, autopay) and create nothing. | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/reviseInvoice" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","expectedUpdatedAt":"","emailCustomer":false}' ``` actions ## Void job adjustment POST `/v1/actions/voidJobAdjustment` Request voidJobAdjustment: always waits for a person to approve it, whatever the mode; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `void_job_adjustment` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Void job adjustment request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | | `adjustmentId`required | `id` | — | | `reason`required | `string` | up to 500 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/voidJobAdjustment" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":"","adjustmentId":"","reason":""}' ``` actions ## Create payment link POST `/v1/actions/createPaymentLink` Request createPaymentLink: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `create_payment_link` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Create payment link request body | Field | Type | Notes | | --- | --- | --- | | `businessId`optional | `id` | — | | `currency`required | `Currency` | — | | `customName`optional | `string` | up to 120 chars | | `displayAvailability`optional | `boolean` | — | | `expiresAt`optional | `string (date-time)` | at least 20 chars · up to 35 chars | | `fee`optional | `object` | — | | `fee.appliesTo`required | `enum` | One of `card`, `all` | | `fee.flat`optional | `object` | — | | `fee.flat.currency`required | `Currency` | — | | `fee.flat.minorUnits`required | `integer` | — | | `fee.label`required | `enum` | One of `service_fee`, `platform_fee`, `handling_fee` | | `fee.rateBps`optional | `integer` | min 0 · max 1000 | | `fixedAmount`optional | `object` | — | | `fixedAmount.currency`required | `Currency` | — | | `fixedAmount.minorUnits`required | `integer` | — | | `kind`required | `enum` | One of `oneTime`, `reusable` | | `maxAmount`optional | `object` | — | | `maxAmount.currency`required | `Currency` | — | | `maxAmount.minorUnits`required | `integer` | — | | `maxPayments`optional | `integer` | min 1 · max 100000 | | `minAmount`optional | `object` | — | | `minAmount.currency`required | `Currency` | — | | `minAmount.minorUnits`required | `integer` | — | | `preset`required | `enum` | One of `services`, `ticket`, `donation`, `custom` | | `pricing`required | `enum` | One of `fixed`, `range`, `tiered` | | `tiers[]`optional | `object[]` | — | | `tiers[].amount`required | `object` | — | | `tiers[].amount.currency`required | `Currency` | — | | `tiers[].amount.minorUnits`required | `integer` | — | | `tiers[].upTo`required | `integer` | min 1 | | `targetId`optional | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/createPaymentLink" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"currency":"USD","fee":{"appliesTo":"card","flat":{"currency":"USD","minorUnits":0},"label":"service_fee"},"fixedAmount":{"currency":"USD","minorUnits":0},"kind":"oneTime","maxAmount":{"currency":"USD","minorUnits":0},"minAmount":{"currency":"USD","minorUnits":0},"preset":"services","pricing":"fixed"}' ``` actions ## Update payment link POST `/v1/actions/updatePaymentLink` Request updatePaymentLink: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `update_payment_link` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Update payment link request body | Field | Type | Notes | | --- | --- | --- | | `businessId`optional | `id` | — | | `currency`optional | `Currency` | — | | `customName`optional | `string` | up to 120 chars | | `displayAvailability`optional | `boolean` | — | | `expiresAt`optional | `string (date-time)` | at least 20 chars · up to 35 chars | | `fee`optional | `object` | — | | `fee.appliesTo`required | `enum` | One of `card`, `all` | | `fee.flat`optional | `object` | — | | `fee.flat.currency`required | `Currency` | — | | `fee.flat.minorUnits`required | `integer` | — | | `fee.label`required | `enum` | One of `service_fee`, `platform_fee`, `handling_fee` | | `fee.rateBps`optional | `integer` | min 0 · max 1000 | | `fixedAmount`optional | `object` | — | | `fixedAmount.currency`required | `Currency` | — | | `fixedAmount.minorUnits`required | `integer` | — | | `kind`optional | `enum` | One of `oneTime`, `reusable` | | `maxAmount`optional | `object` | — | | `maxAmount.currency`required | `Currency` | — | | `maxAmount.minorUnits`required | `integer` | — | | `maxPayments`optional | `integer` | min 1 · max 100000 | | `minAmount`optional | `object` | — | | `minAmount.currency`required | `Currency` | — | | `minAmount.minorUnits`required | `integer` | — | | `preset`optional | `enum` | One of `services`, `ticket`, `donation`, `custom` | | `pricing`optional | `enum` | One of `fixed`, `range`, `tiered` | | `tiers[]`optional | `object[]` | — | | `tiers[].amount`required | `object` | — | | `tiers[].amount.currency`required | `Currency` | — | | `tiers[].amount.minorUnits`required | `integer` | — | | `tiers[].upTo`required | `integer` | min 1 | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/updatePaymentLink" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"fee":{"appliesTo":"card","flat":{"currency":"USD","minorUnits":0},"label":"service_fee"},"fixedAmount":{"currency":"USD","minorUnits":0},"maxAmount":{"currency":"USD","minorUnits":0},"minAmount":{"currency":"USD","minorUnits":0},"targetId":""}' ``` actions ## Enable payment link POST `/v1/actions/enablePaymentLink` Request enablePaymentLink: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:money` Effect Proposes an action a person approves MCP tool `enable_payment_link` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Enable payment link request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/enablePaymentLink" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Rotate payment link token POST `/v1/actions/rotatePaymentLinkToken` Request rotatePaymentLinkToken: waits for a person to approve it when a connected assistant asks; only the built-in BillingMart Agent, in Auto, may run it under a matching owner rule; a dry run in plan mode. Scope `actions:records` Effect Proposes an action a person approves MCP tool `rotate_payment_link_address` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Request body JSON. Money is an integer count of minor units beside its currency; quantities are thousandths. Rotate payment link token request body | Field | Type | Notes | | --- | --- | --- | | `targetId`required | `id` | — | | `agentNote`optional | `string` | up to 1000 chars | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `TOO_MANY_PENDING_ACTIONS` , `NOT_A_DRAFT` , `INVALID_TRANSITION` , `AGENT_ACTIONS_CAP` , `AGENT_KILL_SWITCH` , `PLAN_LIMIT` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/rotatePaymentLinkToken" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"targetId":""}' ``` actions ## Wait GET `/v1/actions/{actionId}/wait` Wait, up to 25 seconds, for a person to decide an action this connection proposed. Answers as soon as the status leaves pending; otherwise answers the pending action with retryAfterSeconds. Served by its own function so a parked wait never starves the API. Scope `actions:read` Effect Read only MCP tool `wait_for_action` Retries Safe to repeat ### Parameters Wait parameters | Name | In | Type | Notes | | --- | --- | --- | --- | | `actionId`required | path | `id` | — | | `maxWaitSeconds`optional | query | `integer` | min 0 · max 25 | ### Returns `data`: `object` Example request Sample ``` curl -X GET "https://api.billingmart.com/v1/actions/{actionId}/wait" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" ``` actions ## Withdraw POST `/v1/actions/{actionId}/withdraw` Withdraw a pending action this connection proposed. Nothing runs; a person can no longer approve it. Scope `actions:propose` Effect Writes a draft or record MCP tool `withdraw_action` Retries Send an Idempotency-Key; a repeat replays the stored answer for 24 hours ### Parameters Withdraw parameters | Name | In | Type | Notes | | --- | --- | --- | --- | | `actionId`required | path | `id` | — | ### Returns `data`: `object` Errors this route can answer besides the shared ones: `ALREADY_DECIDED` . Example request Sample ``` curl -X POST "https://api.billingmart.com/v1/actions/{actionId}/withdraw" \ -H "Authorization: Bearer $BILLINGMART_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" ``` Next section ## Webhooks Endpoints BillingMart signs and posts events to, and the log of every attempt. [Continue to Webhooks →](https://billingmart.com/developers/api/webhooks) ## Try it against your sandbox Create a bmk_test_ key in the console. It can only reach your sandbox workspace. [Start free](https://app.billingmart.com/sign-up) [All sections](https://billingmart.com/developers/api) --- This is the Markdown copy of https://billingmart.com/developers/api/actions. Live plans, prices and limits are published as JSON at https://billingmart.com/plans.json and https://billingmart.com/agent-info.json.