Rovas exposes a REST API so partners, plugins, and apps can create accounts, file work reports, read Merits, and plug into NeoFund products such as Civic.
| Environment | Base URL |
|---|---|
| Production | https://rovas.app |
| Development | https://dev.rovas.app |
Service paths use the prefix /rovas. OAuth protocol paths use /oauth2.
Send Accept: application/json and, for POST/PUT bodies, Content-Type: application/json.
If you are planning an integration, contact us — we can provision partner access and review your use case.
Solutions built with the API
Apps and plugins that integrate third-party tools with Rovas are listed on the Rovas connectors page.
Which API should I use?
| Model | How you authenticate | Best for |
|---|---|---|
| Classic | HTTP headers API-KEY and TOKEN |
Partner backends, website plugins, server-to-server jobs |
| OAuth 2 (Bearer) | Authorization: Bearer <access_token> |
Mobile / SPA clients with browser login (e.g. Civic) |
Do not mix both on one request. Classic endpoints expect API keys; Civic-oriented endpoints have API-key auth disabled and expect Bearer (or are public).
Auth labels in this reference
| Label | Meaning |
|---|---|
| API-KEY | Headers API-KEY + TOKEN (classic) |
| Bearer | Authorization: Bearer with scope user_profile |
| Public | No credentials (API-key auth disabled on the resource) |
| Optional Bearer | Public read; Bearer adds user-specific fields |
Classic API — how to use it
Credentials
- Sign in to Rovas and open My account → Rovas API.
- Generate credentials for the
rovas_endpointendpoint. - On each authenticated call, send:
API-KEY: <your api key>
TOKEN: <your token>
Each key pair belongs to one Rovas user. Calls run as that user.
Partner signup (create or link an end user)
Charities and other partners that create Rovas accounts for donors or members need a technical account with the api client role (assigned by NeoFund/Rovas admins). That account’s API key is used only for account provisioning.
Preferred endpoint
POST /rovas/rovas_partner_user
Legacy equivalent: POST /rovas/rules/rules_create_user (same body and response).
Request body (required fields)
| Field | Description |
|---|---|
user_name |
Display name |
user_id |
Your external numeric user id |
user_email |
Email (used to find an existing Rovas account) |
user_country |
ISO 3166-1 alpha-2, uppercase (e.g. SK) |
user_language |
Language code (e.g. sk, en) |
server_url |
Your site base URL (e.g. https://partner.example/) |
Optional: hybridauth_provider (defaults to Nabezky if empty), partner_client_id.
List allowed providers: GET /rovas/rovas_hybridauth_providers.json (usually public).
Success response
{
"rovas_uid": 123,
"api_key": "…",
"token": "…"
}
Store the returned api_key / token and use them as API-KEY / TOKEN for later calls on behalf of that end user.
Example
curl -sS -X POST "https://rovas.app/rovas/rovas_partner_user" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "API-KEY: $PARTNER_API_KEY" \
-H "TOKEN: $PARTNER_TOKEN" \
-d '{
"user_name": "Jane Partner User",
"user_id": 12345,
"user_email": "jane@example.com",
"user_country": "SK",
"user_language": "en",
"server_url": "https://partner.example/",
"hybridauth_provider": "Nabezky"
}'
Typical errors: 400 validation, 401 bad credentials, 403 missing api client permission.
Classic endpoint reference
Request/response schemas for these calls are maintained in an OpenAPI file (available on request). Summary:
Accounts & identity
| Method | Path | Auth | Purpose |
|---|---|---|---|
POST |
/rovas/rovas_partner_user |
API-KEY | Preferred create/link partner user; returns rovas_uid, api_key, token |
POST |
/rovas/rules/rules_create_user |
API-KEY | Legacy create/link (same body/response) |
GET |
/rovas/rovas_hybridauth_providers.json |
Public* | List HybridAuth providers for hybridauth_provider |
POST |
/rovas/rules/rules_fetch_user_data |
API-KEY | Profile info for the key owner |
POST |
/rovas/rules/rules_users_chrons |
API-KEY | Chron balances |
POST |
/rovas/rules/rules_user_s_merits |
API-KEY | Merit totals (optional NACE filter) |
POST |
/rovas/rules/rules_check_enabled_language |
API-KEY | Whether a 2-letter language code is enabled |
*Usually public when “Disable API keys authentication” is set on the resource.
Projects & work reports
| Method | Path | Auth | Purpose |
|---|---|---|---|
POST |
/rovas/rules/rules_proxy_create_new_project |
API-KEY | Create project |
POST |
/rovas/rules/rules_proxy_delete_project |
API-KEY | Delete project |
POST |
/rovas/rules/rules_proxy_create_work_report |
API-KEY | Create work report |
POST |
/rovas/rules/rules_proxy_delete_work_report |
API-KEY | Delete work report |
POST |
/rovas/rules/rules_proxy_report_editability |
API-KEY | Is work report editable by caller |
POST |
/rovas/rules/rules_proxy_work_report_verifiability |
API-KEY | Is work report verifiable by caller |
POST |
/rovas/rules/rules_proxy_report_verification_status |
API-KEY | Verification status |
POST |
/rovas/rules/rules_create_verification |
API-KEY | Create verification |
POST |
/rovas/rules/rules_create_verification_with_acccess_token |
Public† | Create verification via access token |
POST |
/rovas/rules/rules_proxy_check_verifier_by_access_tokens |
see OpenAPI | Verifiability via access tokens |
POST |
/rovas/rules/rules_proxy_reward_work_report |
API-KEY | Reward a work report |
GET |
/rovas/rovas_verifications.json |
API-KEY | List work-report verifications |
GET |
/rovas/rovas_comment_notices.json |
API-KEY | Pending watched-comment notices (same store as Civic Bearer twin) |
PUT |
/rovas/node/{id} |
API-KEY | Update node owned by key owner |
DELETE |
/rovas/node/{id} |
API-KEY | Delete node owned by key owner |
†Typo in rule machine name (acccess) is intentional in the live path.
Shares, purchases, conversions
| Method | Path | Auth | Purpose |
|---|---|---|---|
POST |
/rovas/rules/rules_proxy_check_or_add_shareholder |
API-KEY | Ensure user share on project |
POST |
/rovas/rules/rules_proxy_check_or_add_project_shareholder |
API-KEY | Ensure project-as-shareholder |
POST |
/rovas/rules/rules_proxy_purchase_product |
API-KEY | Process product purchase |
POST |
/rovas/rules/rules_proxy_create_aur |
API-KEY | Asset usage record (usage fee) |
POST |
/rovas/rules/rules_get_merits_for_projects |
API-KEY | Merit values for pipe-separated project IDs |
POST |
/rovas/rules/rules_convert_euros_to_chrons |
API-KEY | EUR → Chron quote |
POST |
/rovas/rules/rules_convert_euros_to_chrons_reverse |
API-KEY | Chron → EUR quote |
Views (leaderboards / feeds)
| Method | Path | Auth | Purpose |
|---|---|---|---|
GET |
/rovas/views/top_10_workers_in_a_category |
see OpenAPI | Top workers in a category |
GET |
/rovas/views/project_merits_feed |
see OpenAPI | Top rewarders of a project |
GET |
/rovas/views/projects_merits |
see OpenAPI | Top users across same-site projects |
OAuth 2 / Bearer — how to use it
OAuth is used by NeoFund’s Civic app and by other clients we register. New products need their own OAuth client — do not reuse Civic’s client_id from a third-party app.
Protocol endpoints
| Method | Path | Auth | Notes |
|---|---|---|---|
GET |
/oauth2/authorize |
browser session | PKCE; Civic supports lang, intent |
POST |
/oauth2/token |
public client + PKCE | authorization_code / refresh_token |
POST |
/oauth2/revoke |
token | Revoke access/refresh |
GET |
/oauth2/tokens/{access_token} |
— | Introspect → user_id, client_id, expires, scope (404 if invalid) |
Civic client (reference)
| Setting | Value |
|---|---|
client_id |
civic |
| Client type | Public (no secret) |
| Grants | Authorization code + refresh token |
| PKCE | Required (S256) |
| Scope | user_profile |
| Redirect | civic://oauth/callback |
Authorize query extras: lang=sk|en, intent=login|register.
Token exchange (authorization code + PKCE)
curl -sS -X POST "https://rovas.app/oauth2/token" \
-d grant_type=authorization_code \
-d client_id=civic \
-d redirect_uri=civic://oauth/callback \
-d code=PASTE_CODE \
-d code_verifier=$VERIFIER
Call an API with Bearer
curl -sS "https://rovas.app/rovas/me" \
-H "Accept: application/json" \
-H "Authorization: Bearer $ACCESS_TOKEN"
Example GET /rovas/me response:
{
"uid": 42,
"username": "sano",
"display_name": "Alexander Žaťko",
"total_me": 1248.35,
"total_chr": 320.0,
"created": "2019-03-12T14:22:01+00:00",
"language": "sk",
"receipt_history_retention": null
}
OAuth / Civic endpoint reference
API-key authentication is disabled on these resources. Use Bearer where required.
Home & profile
| Method | Path | Auth | Purpose |
|---|---|---|---|
GET |
/rovas/me |
Bearer | Profile: uid, username, display_name, total_me, total_chr, created, language, receipt_history_retention |
GET |
/rovas/contributions/aggregate |
Public | Community Merit total (+ category placeholders) |
GET |
/rovas/merit_distribution |
Optional Bearer | JSON Merit histogram; user_* fields when Bearer present |
POST |
/rovas/civic_receipt_history_preference |
Bearer | Set receipt history retention (keep | policy) |
GET |
/rovas/civic_merit_history |
Bearer | Caller’s Merit ledger rows |
Users
| Method | Path | Auth | Purpose |
|---|---|---|---|
GET |
/rovas/users_search?query= |
Bearer | Typeahead search (param is query, not q) |
GET |
/rovas/users_lookup?username= |
Bearer | Public community profile (+ nace_expertise, tab aggregates). Users with total_me < 0 → 404 |
Optional: lang=sk|en on lookup for localized fields.
Tax claims
| Method | Path | Auth | Purpose |
|---|---|---|---|
POST |
/rovas/rules/rules_proxy_claim_vat_receipt |
Bearer | Claim eKasa VAT as donor Merits (split shares[]) |
GET |
/rovas/civic_claims?view=submitted|received |
Bearer | Claim lists |
GET |
/rovas/civic_claims?receipt_uid= |
Bearer | { claimed, receipt_uid } only |
GET |
/rovas/civic_claims/summary |
Bearer | Totals for caller |
GET |
/rovas/civic_national_hourly_rate?country= |
Public | National hourly rate used in ME formula |
Projects, charity catalog, gifts
| Method | Path | Auth | Purpose |
|---|---|---|---|
GET |
/rovas/civic_project/{nid} |
Public‡ | Project detail (donate_iban, org fields, …) |
GET |
/rovas/civic_project_work_reports?project_nid= |
Public‡ | Work reports for project |
GET |
/rovas/civic_project_shareholders?project_nid= |
Public‡ | Shareholders |
GET |
/rovas/civic_charity_projects |
Public | Approved public-benefit project catalog |
POST |
/rovas/civic_create_charity_org |
Bearer | Donor submits a public-benefit org |
‡Anonymous allowed for NeoFund-approved public-benefit projects; otherwise Bearer / access rules apply.
Volunteer work reports
| Method | Path | Auth | Purpose |
|---|---|---|---|
GET |
/rovas/civic_my_projects |
Bearer | Recent projects the user reported on |
GET |
/rovas/civic_projects_search?query= |
Bearer | Search publishable projects (query ≥ 3 chars) |
GET |
/rovas/civic_nace_tree |
Public | NACE activity tree |
POST |
/rovas/civic_create_project |
Bearer | Create project |
POST |
/rovas/civic_create_work_report |
Bearer | Create work report (proof: URL, photos, and/or map) |
GET |
/rovas/civic_work_report_map_config |
Bearer | Map widget config for location proof |
POST |
/rovas/civic_ai_nace |
Bearer | AI NACE + title suggestion (optional module) |
Verification & notifications
| Method | Path | Auth | Purpose |
|---|---|---|---|
GET |
/rovas/civic_pending_verifications |
Bearer | Work reports assigned to caller to verify |
GET |
/rovas/civic_work_report/{nid} |
Bearer | Verifier-facing work-report detail |
POST |
/rovas/civic_submit_verification |
Bearer | Approve / reject / decline |
GET |
/rovas/civic_pending_comment_notices |
Bearer | Polled watched-comment notices |
Merit index & spotlight
| Method | Path | Auth | Purpose |
|---|---|---|---|
GET |
/rovas/civic_merit_index |
Public | Snapshot leaderboard (by_category, by_source, …) |
GET |
/rovas/civic_merit_index_countries |
Public | Country filter options |
GET |
/rovas/civic_merit_spotlight |
Public | Period leads by Civic area |
GET |
/rovas/civic_merit_period_index |
Public | ME•ter period leaderboard |
Support
Questions, OpenAPI schemas, or a new OAuth client: contact NeoFund.