📖 Folkemarked API

REST + JSON. Push hele porteføljen din automatisk.

Autentisering

Lag et token i bedriftssenteret og send det som Bearer-token. Tokenet avgjør hvilken bedrift annonsene knyttes til.

Authorization: Bearer ft_live_…

Endepunkter

PUT/api/v1/listings/{external_id} — opprett/oppdater (upsert). Dedupe på (bedrift, external_id).
GET/api/v1/listings — list bedriftens annonser (filtre: vertical, status, limit, offset).
GET/api/v1/listings/{external_id} — hent én annonse.
DELETE/api/v1/listings/{external_id} — trekk tilbake (status = withdrawn).
POST/api/v1/listings/{external_id}/sold — marker som solgt.

external_id er din egen ID for objektet (analogt med IADIF ORDERNO). Den er unik per bedrift, så to bedrifter kan begge bruke «123» uten konflikt. Svaret returnerer Folkemarkeds id og offentlig URL.

Eksempel — upsert en bil

curl -X PUT https://folkemarked.no/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": "Velholdt, full servicehistorikk.",
    "price": 459000,
    "location": "Stavanger",
    "attrs": {
      "make": "Volvo", "model": "XC60", "year": 2021,
      "km": 58000, "fuel": "Hybrid", "gearbox": "Automat",
      "power": 197, "body": "SUV", "color": "Sort"
    }
  }'

Verticals: car · property · boat · generic. Attributtnøklene er de samme som i Folkemarked-skjemaet for hver vertikal.

Svar

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

Stillinger — /api/v1/jobs

Samme Bearer-token og samme grenser. Stillinger nøkles på (bedrift, external_id) og publiseres under firmaprofilen din — gratis ut 2027.

PUT/api/v1/jobs/{external_id} — opprett/oppdater (upsert).
GET/api/v1/jobs — list bedriftens stillinger.
GET/api/v1/jobs/{external_id} — hent én stilling.
DELETE/api/v1/jobs/{external_id} — trekk tilbake.
POST/api/v1/jobs/{external_id}/closed — marker som besatt/lukket.
curl -X PUT https://folkemarked.no/api/v1/jobs/HR-2031 \
  -H "Authorization: Bearer ft_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Backend-utvikler (PHP/MySQL)",
    "description": "Vi søker en utvikler til produktteamet vårt.",
    "location": "Stavanger",
    "category": "IT",
    "employment_type": "fast", "extent": "heltid", "sektor": "privat", "remote": "delvis",
    "deadline": "2026-10-31",
    "apply_url": "https://example.no/jobb/2031"
  }'

Felt: title* · location* · description · company (standard: firmanavnet) · category (bransje) · employment_type (fast/vikariat/engasjement) · extent (heltid/deltid) · sektor · remote · deadline (ÅÅÅÅ-MM-DD) · apply_url (lenke eller e-post) · status. Svaret har samme form som for annonser, med url til stillingen.

Bilder

Bilder kan ikke sendes via API-et ennå. En images-nøkkel ignoreres og meldes i warnings. Last opp bilder i bedriftssenteret (Rediger på annonsen) — annonser uten bilde vises med plassholder.

Feil

Alle feil er JSON med feltet error. Valideringsfeil (422) lister hvert felt med en melding; ukjente felt i kroppen avvises ikke, men nevnes i warnings i svaret.

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

Grenser

Per token: 600 skrive-forespørsler (PUT/POST/DELETE) og 6 000 lese-forespørsler per minutt. Over grensen svarer vi 429 med Retry-After: 60. Én PUT per objekt per synk holder — upsert er idempotent.