Base path
The canonical API path is/v2/wallets. All wallet endpoints use this path prefix.
Authentication
All requests require a Bearer token in theAuthorization header. If the token is missing or invalid, the API returns 401.
Environments
| Environment | Base URL |
|---|---|
| Sandbox | https://sandbox.groundtech.co |
| Production | https://production.groundtech.co |
ethereum_sepolia and may expose a smaller yield-source catalog than production.
Sandbox is limited to a subset of networks for integration testing. Unlike production, sandbox chain keys include the network suffix to make the testnet explicit:
ethereum_sepolia— Ethereum Sepolia testnet
arbitrum, base, ethereum, polygon, solana). See Supported Chains for details.
Pagination
List endpoints use cursor-based pagination withlimit and cursor parameters.
nextCursor field. Pass it as cursor to fetch the next page:
nextCursor is null, you have reached the end of the result set.
Additional query parameters on list endpoints:
sort: field to sort by (e.g.createdAt)order:desc(default) orasccreatedAtGte: ISO-8601 timestamp filterstatus: repeatable status filter (e.g.status=processing&status=completed)
Idempotency
Create and withdrawal endpoints accept arequestId (UUID v4). Retrying the same request with the same requestId returns the original response: 201 for the initial creation and 200 for an idempotent replay. If the requestId was already used with different parameters, the API returns 409 Conflict.
yieldSourceId and pct. Legacy positionKey / targetWeightBps request payloads remain accepted for backwards compatibility, but new integrations should use yield source IDs.
409 response:
409, fetch the existing resource by requestId rather than retrying the create.
Rate limiting
All/v2 endpoints are rate limited:
| Scope | Limit |
|---|---|
General (all /v2 endpoints) | 200 requests/min |
| Write endpoints (POST, PATCH, DELETE) | 20 requests/min |
| Header | Description |
|---|---|
RateLimit-Limit | Maximum requests allowed in the current window |
RateLimit-Remaining | Requests remaining in the current window |
RateLimit-Reset | Seconds until the rate limit window resets |
429 Too Many Requests. Back off and retry after the RateLimit-Reset interval.
Error handling
Errors are returned as JSON with a human-readableerror string and a machine-readable code field.
| HTTP status | Meaning | Action |
|---|---|---|
400 | Validation error | Fix the request and retry |
401 | Authentication failed | Check your Bearer token |
404 | Resource not found | Verify the wallet/withdrawal ID |
409 | Duplicate requestId | Fetch the existing resource instead |
429 | Rate limited | Back off and retry after RateLimit-Reset |
500 | Server error | Log the response and retry with backoff |
error and code fields. Use the code field for programmatic branching. Use the error string for logging and debugging.