# Activity log

Everything done in the account, by people and by API keys, with the address it came from: the same log the dashboard shows owners and admins. It holds sign-ins and members' IP addresses, so reading it takes activity:read, a sensitive permission that full access never includes.

## The activity object

| Field | Type | Description |
| --- | --- | --- |
| `id` | string | The id of the entry. |
| `object` | "activity" | The kind of object. |
| `action` | string | What happened, one of the actions below. |
| `description` | string | The action in words, such as "Created a coupon". |
| `actor` | string\|null | Who did it: a person's name, or "API key" and the key's name for something done through the API or the MCP server. Null when the platform did it. |
| `subject` | string\|null | What it was about, in words a person recognises: a key's name, an invoice number, a coupon code. |
| `properties` | object | Details worth keeping, such as what an address or a key's permissions were before a change. Never a secret. |
| `ip_address` | string\|null | The address the request came from. |
| `mode` | "live" \| "test" \| null | The mode it happened in. Null for what belongs to no mode, such as a sign-in or a new member. |
| `created_at` | string | When it happened, as an ISO 8601 timestamp in UTC. |

## Endpoints

- GET `/v1/activity` The log, newest first: the key's mode and what belongs to no mode. Narrow it with ?action= (an action, or sensitive for everything touching access or wallets), ?person=, ?q= (a subject or the start of an IP address), ?from= and ?to= (YYYY-MM-DD). Needs activity:read.

## Example: list what touched access or wallets

```bash
curl 'https://api.velirapay.com/v1/activity?action=sensitive' \
  --fail-with-body --silent --show-error --max-time 30 \
  -H "Authorization: Bearer ${VELIRAPAY_API_KEY:?Set VELIRAPAY_API_KEY}" \
  -H 'Accept: application/json'
```

**Response**

```json
{
  "data": [
    {
      "id": "5821",
      "object": "activity",
      "action": "api_key.created",
      "description": "Created an API key",
      "actor": "Jane Owner",
      "subject": "Shop backend",
      "properties": { "prefix": "vp_live_ab12", "permissions": ["charges:read", "charges:write"] },
      "ip_address": "203.0.113.7",
      "mode": "live",
      "created_at": "2026-11-06T09:12:04.000000Z"
    }
  ],
  …
}
```

## Actions

| Action | Description | Sensitive |
| --- | --- | --- |
| `wallets.changed` | Changed the payout wallets | Yes |
| `wallets.api_access_changed` | Changed whether API keys and AI apps may change the payout wallets | Yes |
| `payment_settings.updated` | Updated the payment settings |  |
| `profile.updated` | Updated the public profile |  |
| `business_details.updated` | Updated the business details |  |
| `api_key.created` | Created an API key | Yes |
| `api_key.updated` | Changed an API key | Yes |
| `api_key.revoked` | Revoked an API key | Yes |
| `webhook.created` | Added a webhook endpoint |  |
| `webhook.updated` | Updated a webhook endpoint |  |
| `webhook.deleted` | Deleted a webhook endpoint |  |
| `webhook.secret_rotated` | Rotated a webhook signing secret | Yes |
| `member.invited` | Invited a member | Yes |
| `member.joined` | Joined the organization | Yes |
| `member.role_changed` | Changed a member's role | Yes |
| `member.removed` | Removed a member | Yes |
| `payment_link.created` | Created a payment link |  |
| `payment_link.updated` | Changed a payment link |  |
| `payment_link.archived` | Archived a payment link |  |
| `payment_link.restored` | Restored a payment link |  |
| `member.invitation_canceled` | Canceled an invitation | Yes |
| `charge.payment_requested` | Emailed a customer a payment request |  |
| `webhook.disabled` | Had a webhook endpoint switched off | Yes |
| `charge.canceled` | Canceled a charge |  |
| `charge.accepted` | Accepted a charge as paid |  |
| `refund.recorded` | Recorded a refund |  |
| `invoice.voided` | Voided an invoice |  |
| `plan.payment_started` | Started paying for Pro in crypto |  |
| `plan.subscription_canceled` | Canceled the Pro subscription |  |
| `plan.subscription_resumed` | Resumed the Pro subscription |  |
| `auth.signed_in` | Signed in |  |
| `auth.sign_in_failed` | Could not sign in | Yes |
| `auth.password_changed` | Changed their password | Yes |
| `auth.two_factor_enabled` | Turned on two-factor authentication | Yes |
| `auth.two_factor_disabled` | Turned off two-factor authentication | Yes |
| `auth.signed_out_elsewhere` | Signed out of every other browser | Yes |
| `auth.two_factor_failed` | Gave a wrong two-factor code | Yes |
| `auth.email_changed` | Changed their email address | Yes |
| `auth.passkey_added` | Added a passkey | Yes |
| `auth.passkey_removed` | Removed a passkey | Yes |
| `coupon.created` | Created a coupon |  |
| `coupon.updated` | Changed a coupon |  |
| `coupon.deleted` | Deleted a coupon |  |
| `auth.app_connected` | Connected an AI app | Yes |
| `auth.app_disconnected` | Disconnected an AI app | Yes |
| `chat.connected` | Connected chat notifications |  |
| `chat.updated` | Changed chat notifications |  |
| `chat.removed` | Disconnected chat notifications |  |
| `chat.disabled` | Had chat notifications switched off | Yes |
| `sanctions.matched` | Received a payment from an address on the sanctions list | Yes |
| `sanctions.accepted` | Accepted a payment from an address on the sanctions list | Yes |
| `sanctions.return_requested` | Asked for a payment from an address on the sanctions list to be returned | Yes |
| `auth.social_connected` | Connected an account to sign in with | Yes |
| `auth.social_disconnected` | Disconnected an account they signed in with | Yes |
