v1

    API-dokumentation

    Praktik.se exponerar ett REST-API så att företag kan skapa, uppdatera och ta bort praktikannonser från sina egna system (ATS, jobbportaler, intranät).

    Bas-URL https://app.praktik.se/functions/v1/api/v1 kontrolleras…

    Komma igång

    1. Logga in på ditt företagskonto och gå till Inställningar.
    2. Skapa en API-nyckel under "API-nycklar" och kopiera den (visas en gång).
    3. Skicka anrop med Authorization: Bearer pk_live_....

    Bas-URL: https://app.praktik.se/functions/v1/api/v1

    OpenAPI-specifikation: /openapi.json – importera i Postman, Insomnia eller Swagger UI för auto-genererade exempel mot rätt bas-URL.

    Anropar GET https://app.praktik.se/functions/v1/api/v1/meta – ingen API-nyckel krävs. Timeout 8s, upp till 3 försök vid nätverksfel.

    Exakt curl-kommando som körs

    curl -i --max-time 8 https://app.praktik.se/functions/v1/api/v1/meta

    Autentisering

    Alla anrop (förutom /v1/meta) kräver headernAuthorization: Bearer pk_live_.... En ogiltig eller återkallad nyckel ger 401 unauthorized.

    Nycklar lagras endast som SHA-256-hash hos oss. Tappar du bort en nyckel kan du återkalla den och skapa en ny i inställningarna.

    Felformat

    {
      "error": {
        "code": "validation_error",
        "message": "Ogiltig request-body.",
        "fields": { "job_title": ["Krävs (minst 2 tecken)."] }
      }
    }

    unauthorized – nyckel saknas eller är ogiltig (401).

    forbidden – nyckeln tillhör inte annonsens företag (403).

    not_found – resursen finns inte (404).

    validation_error – ogiltiga fält i bodyn (400).

    tier_limit_reached – maxgräns för aktiva annonser nådd (422). Free: 5, Premium: 50.

    rate_limited – för många anrop (429). Max 60 anrop per minut per nyckel. Svaret innehåller Retry-After: 60.

    method_not_allowed – fel HTTP-metod (405).

    internal_error – något gick fel på vår sida (500).

    Fältreferens — annons

    FältTypKravBeskrivning
    job_titlestringobligatorisktAnnonsens titel (minst 2 tecken).
    descriptionstring (markdown)obligatorisktBeskrivning, stöd för markdown.
    locationstringobligatorisktOrt (svenska kommuner).
    deadlinestringobligatorisktSista ansökningsdag i format YYYY-MM-DD.
    paidstringvalfritt"Betald" eller "Obetald". Utelämnas fältet sätts "Obetald".
    fieldsstring[]valfrittBranscher/roller.
    start_datestringvalfrittStartdatum eller fri text.
    about_companystringvalfrittOm företaget (markdown).
    logo_urlstring (url)valfrittLogotyp till annonsen.
    image_urlstring (url)valfrittHero-bild.
    external_application_urlstring (url)valfrittOm ansökan ska ske på extern sida.
    contact_personobjectvalfrittKontaktperson: { name, email, phone }.
    publishbooleanvalfrittSätter status till "published".
    statusstringvalfritt"draft" eller "published". Default "draft".
    published_atISO-tidvalfrittSätts automatiskt vid publicering.

    Endpoints

    GET/v1/meta

    Hämta tillåtna värden

    Returnerar enum-värden och tillgängliga endpoints. Kräver inte autentisering.

    Exempel (curl)

    curl https://app.praktik.se/functions/v1/api/v1/meta
    GET/v1/internships

    Lista företagets annonser

    Returnerar alla annonser kopplade till nyckelns företag. Paginera med ?limit (max 100) och ?offset.

    Response

    {
      "data": [ { "id": "...", "job_title": "...", "status": "published", ... } ],
      "pagination": { "limit": 20, "offset": 0, "total": 42 }
    }

    Exempel (curl)

    curl https://app.praktik.se/functions/v1/api/v1/internships?limit=20 \
      -H "Authorization: Bearer pk_live_..."
    POST/v1/internships

    Skapa annons

    Skapar en ny annons. Med 'publish: true' publiceras den direkt (omfattas av tier-gränsen 3 free / 50 premium).

    Request body

    {
      "job_title": "Frontend-praktikant",
      "description": "## Om rollen\nDu kommer att...",
      "location": "Stockholm",
      "deadline": "2026-08-15",
      "paid": "Betald",
      "fields": ["IT & Teknik"],
      "contact_person": { "name": "Anna", "email": "anna@example.com" },
      "publish": true
    }

    Exempel (curl)

    curl -X POST https://app.praktik.se/functions/v1/api/v1/internships \
      -H "Authorization: Bearer pk_live_..." \
      -H "Content-Type: application/json" \
      -d '{ "job_title": "Frontend-praktikant", "description": "...", "location": "Stockholm", "deadline": "2026-08-15", "paid": "Betald", "publish": true }'
    GET/v1/internships/:id

    Hämta en annons

    Returnerar en enskild annons. 404 om id inte finns; 403 om annonsen tillhör ett annat företag.

    Exempel (curl)

    curl https://app.praktik.se/functions/v1/api/v1/internships/<id> \
      -H "Authorization: Bearer pk_live_..."
    PATCH/v1/internships/:id

    Uppdatera annons

    Skickar in endast de fält som ska ändras. Att sätta status till 'published' följer tier-gränsen.

    Request body

    { "deadline": "2026-09-01", "status": "published" }

    Exempel (curl)

    curl -X PATCH https://app.praktik.se/functions/v1/api/v1/internships/<id> \
      -H "Authorization: Bearer pk_live_..." \
      -H "Content-Type: application/json" \
      -d '{ "deadline": "2026-09-01" }'
    DELETE/v1/internships/:id

    Ta bort annons

    Tar bort annonsen permanent. Svarar 204 vid framgång.

    Exempel (curl)

    curl -X DELETE https://app.praktik.se/functions/v1/api/v1/internships/<id> \
      -H "Authorization: Bearer pk_live_..."

    Changelog

    2026-06-27 — v1 lanseras: CRUD för annonser, API-nycklar i företagsinställningarna.