Multando
Developer Portal

Integrate Multando in Minutes

Add traffic infraction reporting to your app with our SDKs. Available for Flutter, React Native, iOS, and Android.

3-Line Integration
Drop-in UI Components
Offline Support
Auto Token Refresh
i18n Built-in
Full Type Safety

Quick Start

Choose your platform and start reporting in 3 steps

npm install @multando/react-native-sdk
import { MultandoProvider, useMultando } from '@multando/react-native-sdk';

// Wrap your app
<MultandoProvider config={{
  baseUrl: 'https://api.multando.com/api/v1',
  locale: 'en',
}}>
  <App />
</MultandoProvider>

// In any component
const { auth, reports } = useMultando();
await auth.login('user@example.com', 'password');

Manage API Keys

Create sandbox and production keys for your applications

API Key Format

Sandbox

mult_test_xxxxxxxxxxxxxxxx

Production

mult_live_xxxxxxxxxxxxxxxx
OAuth 2.0

Connect Multando (OAuth)

Let users authorize your app to access their Multando account β€” no double login

Authorization Flow

1

Your app redirects to multando.com/oauth/authorize with your client_id, redirect_uri, and requested scopes

2

User sees the consent screen and taps "Authorize"

3

Multando redirects to your callback URL with an authorization code

4

Your backend exchanges the code via POST /api/v1/oauth/token

5

You receive an access_token and refresh_token to act on behalf of the user

Authorize URL

multando.com/oauth/authorize?client_id=YOUR_API_KEY&redirect_uri=myapp://callback&scope=reports:create,balance:read

Code Examples

// Build the authorize URL
final url = client.auth.buildAuthorizeUrl(
  redirectUri: 'myapp://multando-callback',
);
await launchUrl(Uri.parse(url));

// After user authorizes, handle the callback
final tokens = await client.auth.exchangeOAuthCode(
  code: callbackCode,
  redirectUri: 'myapp://multando-callback',
);

Redirect URIs

Register your callback URIs for each API key. Only pre-registered URIs are accepted during authorization.

PUT /api/v1/api-keys/{id}/redirect-uris
{"redirect_uris": ["myapp://callback", "https://myapp.com/callback"]}

Available Scopes

ScopeDescription
reports:createCreate reports on behalf of the user
reports:readRead user's report history
infractions:readList available infraction types
users:readView user profile
balance:readView wallet balance

API Reference

Base URL: https://api.multando.com/api/v1

Full Swagger docs

POST/reportsAuth
GET/reports
GET/reports/{id}
GET/reports/by-plate/{plate}
GET/reports/geojson
GET/widget/reports-map
DELETE/reports/{id}Auth
GeoJSON

Public Data API (GeoJSON)

Cities and third parties can consume our verified-reports data in standard GeoJSON format. No authentication required.

Endpoint

GEThttps://api.multando.com/api/v1/reports/geojson

Query Parameters

ParamTypeDescription
city_idintFilter by city ID
statusstringComma-separated statuses (default: approved,community_verified)
sinceISO 8601ISO 8601 datetime β€” only newer reports
bboxstringBounding box: minLon,minLat,maxLon,maxLat
limitintMax features (1-5000, default 500)
api_keystringOptional API key (header X-API-Key or ?api_key=)

Fetch with curl

curl 'https://api.multando.com/api/v1/reports/geojson?city_id=1&status=approved,community_verified&limit=500'

Embed on your site with Leaflet

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<div id="map" style="height:500px"></div>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
  const map = L.map('map').setView([4.711, -74.072], 12);
  L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
  fetch('https://api.multando.com/api/v1/reports/geojson?city_id=1')
    .then(r => r.json())
    .then(data => L.geoJSON(data).addTo(map));
</script>

Responses never include vehicle plates or reporter identifiers β€” safe to embed publicly.

iframe

Drop-in map widget with your colors

Add an interactive infraction map to your city portal in 1 line

Embed code

<iframe
  src="https://api.multando.com/api/v1/widget/reports-map?tabs=map,leaderboard&default_tab=map&primary_color=e63946&height=560&use_icons=true&lang=en"
  width="100%" height="560" frameborder="0" allow="geolocation"></iframe>

Configuration options

ParamTypeDefaultDescription
city_idintβ€”Filter by city
statusstringapproved,community_verifiedComma-separated statuses
primary_colorhexe63946Accent color (no #)
latfloat4.7110Initial center latitude
lonfloat-74.0721Initial center longitude
zoomint12Initial zoom (1-20)
heightpx500Map height in pixels
show_legendbooltrueShow status legend
langes|enesUI language (alias of locale)
localees|enesUI locale
limitint500Max markers (1-5000)
clusterbooltrueCluster markers
use_iconsboolfalseUse Multando hand-pin icons instead of plain dots
tabsstringmapPanels to show: map, leaderboard, or map,leaderboard
default_tabmap|leaderboardmapTab selected on load (when multiple)

Example color schemes

Bogota (amber)

?primary_color=f59e0b

Medellin (blue)

?primary_color=0066cc

Cali (red)

?primary_color=e63946

Widget shows 'Powered by Multando' β€” free for authority use.

Server SDKs

Backend API Clients

Official clients for server-to-server integration

🐍

Python

pip install multando
from multando import MultandoSyncClient

client = MultandoSyncClient(api_key="mult_live_xxx")
client.login("user@example.com", "password")
reports = client.reports.list()
🟒

Node.js

npm install @multando/node
import { MultandoClient } from '@multando/node';

const client = new MultandoClient({ apiKey: 'mult_live_xxx' });
await client.login('user@example.com', 'password');
const reports = await client.reports.list();
Self-Hosting

Deploy Multando on Your Infrastructure

Run the entire platform on your own servers with Docker. Full control over your data, your rules.

Prerequisites

  • Docker & Docker Compose
  • An Anthropic API key (for AI chatbot)
  • A domain name (optional, for production)
1

Clone the repository

git clone https://github.com/jeronimotech/multando-backend.git

cd multando-backend

cp .env.example .env

2

Configure environment

Edit .env with your secrets. Optionally enable federation to connect to the Multando Hub.

# .env

SECRET_KEY=your-secret-key-here

ANTHROPIC_API_KEY=sk-ant-...

# Optional: connect to the Multando Hub

FEDERATION_ENABLED=true

FEDERATION_HUB_URL=https://api.multando.com

FEDERATION_API_KEY=your-hub-key

3

Start the platform

docker compose -f docker-compose.self-host.yml up -d

This starts PostgreSQL, Redis, MinIO, and the API server. Migrations run automatically on first boot.

4

Verify it works

Check the health endpoint and open the API documentation.

curl http://localhost:8000/health

# {"status":"healthy","version":"0.1.0"}

# API docs at http://localhost:8000/docs

# Frontend at http://localhost:3000

Frontend (optional)

git clone https://github.com/jeronimotech/multando-frontend.git

cd multando-frontend

echo "NEXT_PUBLIC_API_URL=http://localhost:8000/api/v1" > .env

docker build -t multando-frontend .

docker run -p 3000:3000 multando-frontend

How It Works

Your app integrates via SDK. Reports flow through our API to the community for verification.

Your App

SDK integration

Multando API

Validation + storage

Community

Verification + rewards

Two Environments

Test your integration safely in sandbox before going live

πŸ§ͺ

Sandbox

For testing & development

Base URL

https://sandbox-api.multando.com/api/v1

API Key Format

mult_test_xxxxxxxxxxxxxxxx
  • ● Free unlimited testing
  • ● No real tokens or transactions
  • ● Higher rate limits (300/min)
πŸš€

Production

For live applications

Base URL

https://api.multando.com/api/v1

API Key Format

mult_live_xxxxxxxxxxxxxxxx
  • ● Real MULTA token rewards
  • ● Live data and transactions
  • ● Standard rate limits (60/min)

⚠️ Keys are environment-locked β€” Sandbox keys (mult_test_) only work on sandbox-api.multando.com. Production keys (mult_live_) only work on api.multando.com. They cannot be interchanged.

Ready to integrate?

Get your API key and start building in minutes.