📖 Monti API

REST + JSON. Push your whole portfolio automatically.

Authentication

Create a token in the business centre and send it as a Bearer token. The token decides which business the listings are attached to.

Authorization: Bearer ft_live_…

Endpoints

PUT/api/v1/listings/{external_id} — create/update (upsert). Deduped on (business, external_id).
GET/api/v1/listings — list the business's listings (filters: vertical, status, limit, offset).
GET/api/v1/listings/{external_id} — fetch one listing.
DELETE/api/v1/listings/{external_id} — withdraw (status = withdrawn).
POST/api/v1/listings/{external_id}/sold — mark as sold.

external_id is your own ID for the object (analogous to IADIF ORDERNO). It is unique per business, so two businesses can both use «123» without conflict. The response returns Monti's id and the public URL.

Example — upsert a car

curl -X PUT https://monti.mt/api/v1/listings/DLR-7781 \
  -H "Authorization: Bearer ft_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "vertical": "car",
    "title": "Volvo XC60 B4 AWD Inscription",
    "description": "Well kept, full service history.",
    "price": 34900,
    "location": "Birkirkara",
    "attrs": {
      "make": "Volvo", "model": "XC60", "year": 2021,
      "km": 58000, "fuel": "Hybrid", "gearbox": "Automat",
      "power": 197, "body": "SUV", "color": "Sort"
    }
  }'

Verticals: car · property · boat · generic. The attribute keys are the same as in the Monti form for each vertical.

Response

{
  "operation": "created",
  "id": 4821,
  "external_id": "DLR-7781",
  "vertical": "car",
  "status": "active",
  "org_id": 12,
  "url": "https://monti.mt/annonse/Kp7mQ2xT9b/volvo-xc60-b4-awd-inscription",
  "warnings": []
}

Jobs — /api/v1/jobs

Same Bearer token and the same limits. Jobs are keyed on (business, external_id) and published under your business profile — free through 2027.

PUT/api/v1/jobs/{external_id} — create/update (upsert).
GET/api/v1/jobs — list your business's jobs.
GET/api/v1/jobs/{external_id} — fetch one job.
DELETE/api/v1/jobs/{external_id} — withdraw.
POST/api/v1/jobs/{external_id}/closed — mark as filled/closed.
curl -X PUT https://monti.mt/api/v1/jobs/HR-2031 \
  -H "Authorization: Bearer ft_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Backend developer (PHP/MySQL)",
    "description": "We are looking for a developer for our product team.",
    "location": "Birkirkara",
    "category": "IT",
    "employment_type": "fast", "extent": "heltid", "sektor": "privat", "remote": "delvis",
    "deadline": "2026-10-31",
    "apply_url": "https://example.no/jobb/2031"
  }'

Fields: title* · location* · description · company (default: your business name) · category (industry) · employment_type (fast/vikariat/engasjement) · extent (heltid/deltid) · sektor · remote · deadline (YYYY-MM-DD) · apply_url (link or e-mail) · status. The response has the same shape as for listings, with the job's url.

Images

Images cannot be sent through the API yet. An images key is ignored and reported in warnings. Upload photos in the business centre (Edit on the listing) — listings without a photo show a placeholder.

Errors

Every error is JSON with an error field. Validation errors (422) list each field with a message; unknown fields in the body are not rejected but are named in the response's warnings.

401 {"error":"unauthorized","message":"…"}
404 {"error":"not_found","message":"…"}
405 {"error":"method_not_allowed"}
400 {"error":"bad_request","message":"Ugyldig JSON-kropp."}
422 {"error":"validation_failed","errors":[{"field":"title","message":"…"}]}
429 {"error":"rate_limited","message":"…"}   Retry-After: 60

Limits

Per token: 600 write requests (PUT/POST/DELETE) and 6,000 read requests per minute. Above that we answer 429 with Retry-After: 60. One PUT per object per sync is enough — the upsert is idempotent. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Window (seconds) so a client can pace itself.

OpenAPI

The whole contract as an OpenAPI 3 document (JSON) — import it into Postman, Insomnia or a code generator. Public, no token needed.

Download openapi.json