Registry entry
Serbia — Unified Registration Application (JRPPS), Sole Proprietor (Preduzetnik)
The Agency for Business Registers' (Agencija za privredne registre, APR) unified registration application "JRPPS" (Jedinstvena registraciona prijava osnivanja pravnih lica i drugih subjekata i registracije u Jedinstveni registar poreskih obveznika -- Unified Registration Application for the Establishment of Legal Entities and Other Subjects and Registration into the Unified Register of Tax Payers), sole-proprietor (preduzetnik) pathway, 2025 edition. Opens Serbia as the registry's 48th jurisdiction, via Business Formation. This unified application form is shared across many entity types (companies, associations, foundations, chambers of commerce, health/culture institutions, etc.); the sole-proprietor pathway is a distinct, separately-published PDF ("JRPPS_PR") that prints "PREDUZETNIK" as a running header on every content page and always registers in the Register of Business Entities (Registar privrednih subjekata). Confirmed genuinely AcroForm-fillable via pdfjs-dist: 10 pages, 197 distinct visible field names across 219 visible widgets (plus orphan/hidden master-field definitions with no page assignment, an artifact of the underlying shared multi-entity-type AcroForm template). The form's own structure runs: page 1, a cover page shared by all JRPPS entity types (register selection, application cover fields, decision-delivery-method choice, applicant/submitter identity and address, signature declaration); pages 2-9, ten Пословно име (business name) through ПДВ (VAT) sections specific to the predzetnik pathway; page 10, a supporting-documentation checklist. Two structural judgment calls are disclosed here and detailed in VERIFICATION.md: (1) page 1's Register selection (Radio Button1, 11 mutually-exclusive options -- Register of Business Entities, of foreign associations, of sports federations, of bankruptcy estates, of endowments/foundations, of chambers of commerce, of associations, of representative offices of foreign endowments/foundations and of foreign chambers of commerce, of health institutions, of culture institutions) is excluded from fields[] rather than modelled as an open enum, since the sole-proprietor pathway always registers in the Register of Business Entities -- the other 10 options apply to entity types wholly out of scope for this schema, so presenting them as a live choice would misrepresent this pathway's actual decision space; and (2) on page 3, the СЕДИШТЕ (seat) address's "*Број:" (house number) label spans two adjacent AcroForm text widgets (Text36.0, Text37.0) with no distinguishing sub-label, unlike every other "Број и слово" (number and letter) address block on this form, which cleanly uses two widgets under one combined two-concept label. The first widget is modelled as seatHouseNumber; the second is excluded as an unlabeled structural duplicate rather than inventing a meaning for it. GovSchema is independent and is not affiliated with, endorsed by, or operated by the Government of Serbia or the Agency for Business Registers.
Registry entry
rs/apr/jrpps-pr-sole-proprietor-registration
Machine access
- Schema document
registry/rs/apr/jrpps-pr-sole-proprietor-registration/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/rs/apr/jrpps-pr-sole-proprietor-registration/1.0.0/VERIFICATION.mdtext/markdown- Registry catalog
registry/index.jsonone record per schema id
Field reference
160 fields, read from the published schema.json, with names, types, requiredness, and validation as the document states them. The live government form remains the authoritative source.
Fields
-
coverPageBusinessNamestring optionalFree-text name entered on the cover page next to the barcode area assigned by APR. This unified cover page is shared across all JRPPS entity types; for the sole-proprietor pathway the business name is more precisely constructed from entrepreneurFullName + businessNameDesignation + registeredSeatPlace (and, optionally, businessFantasyName) in the ПОСЛОВНО ИМЕ section that follows -- this cover-page field appears to duplicate/summarize that construction for quick reference and name-reservation lookup, disclosed as a judgment call rather than silently merged with the later fields.
-
nameReservationConfirmationNumberstring optionalConfirmation number of a prior name reservation with APR. Entered only if a name reservation was made.
-
requestConfirmationOfSubmissionboolean optionalWhether the applicant is submitting the application directly at the Agency and requests that a confirmation of the submitted application be issued.
-
previousRejectedApplicationNumberstring optionalNumber of a previously-rejected application, when this application is being resubmitted following a prior rejection.
-
decisionDeliveryMethodenum optionalHow the applicant requests the registrar's written decision be delivered. Per the form's own note, the decision's content can always be viewed on APR's website; a written dispatch is sent only on the applicant's explicit request via one of these five channels.
enum: mail-to-applicant-address | mail-to-seat-address | in-person-apr-org-unit | mail-to-postal-receipt-address | in-person-apr-belgrade-hq -
aprOrgUnitNamestring optionalName of the APR organizational unit at which the applicant will collect the decision in person.
-
applicantFirstNamestring optionalFirst name of the person submitting the application (the applicant/submitter, who may be the sole proprietor or a proxy/representative).
classification: pii -
applicantLastNamestring optionalПрезиме
classification: pii -
applicantJmbgOrForeignerRecordNumberstring optionalUnique Master Citizen Number (JMBG) for a domestic applicant, or APR's own records number for a foreign applicant. Entering it lets the applicant look up the application's status on APR's website.
classification: sensitive-pii -
applicantForeignerPassportOrIdNumberstring optionalForeign applicant's passport or ID card number.
classification: sensitive-pii -
applicantForeignerIssuingCountrystring optionalCountry that issued the foreign applicant's passport or ID card.
-
applicantAddressMunicipalitystring optionalApplicant's municipality in the Republic of Serbia. Used only if decisionDeliveryMethod is mail-to-applicant-address.
-
applicantAddressPlacestring optionalМесто
-
applicantAddressStreetstring optionalУлица
-
applicantAddressHouseNumberstring optionalHouse/building number, printed under the combined "Број и слово" (Number and letter) label.
-
applicantAddressHouseLetterstring optionalHouse/building number letter suffix, printed under the combined "Број и слово" (Number and letter) label.
-
applicantAddressPostalCodestring optionalБрој поште
-
applicantAddressPostOfficeNamestring optionalНазив поште
-
applicantAddressFloorstring optionalСпрат
-
applicantAddressApartmentNumberstring optionalБрој стана
-
applicantPhonestring optionalContact phone number of the applicant/submitter (distinct from entrepreneurPhone1/entrepreneurPhone2 on page 4 and taxAuthorityPhoneFixed/taxAuthorityPhoneMobile on page 9).
-
applicantEmailstring optionalContact email of the applicant/submitter (distinct from businessEmailAddress on page 3 and taxAuthorityEmail on page 9).
pattern -
entrepreneurFullNamestring requiredPersonal name and surname of the sole proprietor, the first mandatory component of the business name (пословно име).
classification: pii -
businessNameDesignationenum requiredThe designation appended to the business name: the full word "предузетник" or the abbreviation "пр". Mandatory second component of the business name; the source's two tick-boxes (*ПРЕДУЗЕТНИК: / *ПР:) are modelled as a single mutually-exclusive choice.
enum: preduzetnik | pr -
businessActivityDescriptionstring optionalDescription of the principal business activity; may optionally be included as a component of the business name. Must point to the sole proprietor's predominant activity, and may also describe additional activities.
-
businessFantasyNamestring optionalOptional fantasy/trade name component of the business name (пословно име), distinct from businessActivityDescription. Per the form's own note, it must differ from any already-registered sole proprietor with the same businessActivityDescription, may consist of letters, digits, or the characters "- . &", and if entered, businessActivityDescription must also be entered (the source's own cross-field rule; not machine-enforced here since JRPPS-PR has no field-absence operator to gate on non-empty optional string).
-
registeredSeatPlacestring requiredPlace (town/municipality) forming the third mandatory component of the business name. Restated in full address form (seatMunicipality/seatPlace/seatStreet/etc.) in the СЕДИШТЕ section on page 3 -- both are genuinely separate widgets on the source and are modelled as separate fields rather than silently merged.
-
abbreviatedBusinessNameFullNamestring optionalPersonal name and surname component of the abbreviated business name (скраћено пословно име), registered only if the sole proprietor has a businessFantasyName.
-
abbreviatedBusinessNameDesignationenum optionalThe designation used in the abbreviated business name: "предузетник" or "пр".
enum: preduzetnik | pr -
abbreviatedBusinessNameFantasyNamestring optionalFantasy/trade name component of the abbreviated business name; per the form's own note, may consist of an acronym of the words in businessFantasyName and/or businessActivityDescription.
-
businessNameTranslation1Typeenum optionalWhether this translation of the business name is into a foreign language or a national-minority language. Translations are entered only if they exist ({"уколико постоје"}); the name component itself (Назив) is never translated.
enum: foreign-language | national-minority-language -
businessNameTranslation1Languagestring optionalЈезик
-
businessNameTranslation1Textstring optionalПревод
-
businessNameTranslation2Typeenum optionalWhether this translation of the business name is into a foreign language or a national-minority language. Translations are entered only if they exist ({"уколико постоје"}); the name component itself (Назив) is never translated.
enum: foreign-language | national-minority-language -
businessNameTranslation2Languagestring optionalЈезик
-
businessNameTranslation2Textstring optionalПревод
-
abbreviatedBusinessNameTranslation1Typeenum optionalWhether this translation of the abbreviated business name is into a foreign language or a national-minority language. Translations are entered only if they exist ({"уколико постоје"}); the name component itself (Назив) is never translated.
enum: foreign-language | national-minority-language -
abbreviatedBusinessNameTranslation1Languagestring optionalЈезик
-
abbreviatedBusinessNameTranslation1Textstring optionalПревод
-
abbreviatedBusinessNameTranslation2Typeenum optionalWhether this translation of the abbreviated business name is into a foreign language or a national-minority language. Translations are entered only if they exist ({"уколико постоје"}); the name component itself (Назив) is never translated.
enum: foreign-language | national-minority-language -
abbreviatedBusinessNameTranslation2Languagestring optionalЈезик
-
abbreviatedBusinessNameTranslation2Textstring optionalПревод
-
seatMunicipalitystring requiredMunicipality of the sole proprietor's seat (седиште) -- the place in the Republic of Serbia where the sole proprietor conducts its activity.
-
seatPlacestring requiredМесто (седиште)
-
seatStreetstring requiredУлица (седиште)
-
seatHouseNumberstring requiredSeat street/house number. The source AcroForm renders this as two adjacent boxes (Text36.0, Text37.0) under the single "*Број:" label with no distinguishing sub-label; modelled as one logical field per the form's own single "Број" label (contrast with the "Број и слово" combined-label fields elsewhere, which are modelled as two fields). The second box is disclosed in VERIFICATION.md as an unlabeled structural duplicate rather than silently invented a meaning for.
-
seatHouseLetterstring optionalСлово (седиште)
-
seatFloorstring optionalСпрат (седиште)
-
seatApartmentNumberstring optionalБрој стана (седиште)
-
seatPostalCodestring optionalБрој поште (седиште)
-
seatPostOfficeNamestring optionalНазив поште (седиште)
-
seatAdditionalDescriptionstring optionalAdditional description of the seat location, e.g. market name, stall number, or unit number, for premises not addressable by street number alone.
-
mailingAddressMunicipalitystring optionalMunicipality of the address for receiving mail, entered only if it exists and differs from the seat address. If not registered, the registrar's written decision cannot be requested for delivery to this address.
-
mailingAddressPlacestring optionalМесто (адреса за пријем поште)
-
mailingAddressStreetstring optionalУлица (адреса за пријем поште)
-
mailingAddressHouseNumberstring optionalБрој (адреса за пријем поште)
-
mailingAddressHouseLetterstring optionalСлово (адреса за пријем поште)
-
mailingAddressFloorstring optionalСпрат (адреса за пријем поште)
-
mailingAddressApartmentNumberstring optionalБрој стана (адреса за пријем поште)
-
mailingAddressPostalCodestring optionalБрој поште (адреса за пријем поште)
-
mailingAddressPostOfficeNamestring optionalНазив поште (адреса за пријем поште)
-
mailingAddressAdditionalDescriptionstring optionalДодатни опис (адреса за пријем поште)
-
businessEmailAddressstring requiredThe sole proprietor's official e-mail address of record, a mandatory subject of registration (distinct from applicantEmail on page 1 and taxAuthorityEmail on page 9).
pattern -
isIndefiniteDurationboolean requiredWhether the sole proprietor is being registered for an indefinite term. If false, registeredUntilDate must be provided instead (the form's own either/or choice).
-
registeredUntilDatedate optionalFixed-term registration end date, used only when isIndefiniteDuration is false.
-
businessActivityStartOptionenum requiredWhether the start of business activity will be reported later (via a change-of-data application) or is being reported as of the day of entry into the registry (the decision date of the founding resolution). The source's two independent tick-boxes are modelled as a single mutually-exclusive choice per this registry's usual AcroForm quirk.
enum: report-later | same-as-registration-date -
predominantActivityCodestring requiredFour-digit code of the predominant business activity, per Serbia's activity classification regulation (Уредба о класификацији делатности). Only the predominant activity is entered here; a special law may condition registration or performance of certain activities on a prior permit/consent (see the documents[] checklist).
pattern -
predominantActivityNamestring requiredНазив делатности (претежна делатност)
-
entrepreneurPhone1string optionalSole proprietor's contact phone number. Contact details are not a mandatory subject of registration; if registered, they are published on APR's website.
-
entrepreneurPhone2string optionalТелефон 2
-
entrepreneurFaxstring optionalФакс
-
entrepreneurWebsitestring optionalИнтернет адреса
-
entrepreneurSexenum optionalSex of the sole proprietor, part of the personal data section feeding CROSO/tax administration registration.
enum: male | femaleclassification: pii -
entrepreneurFirstNamestring optionalFirst name of the sole proprietor, split out (with entrepreneurLastName) from entrepreneurFullName for the personal-data/CROSO section.
classification: pii -
entrepreneurLastNamestring optionalПрезиме (лични подаци)
classification: pii -
entrepreneurJmbgOrForeignerRecordNumberstring optionalЈМБГ / Евиденцијски број (предузетник)
classification: sensitive-pii -
entrepreneurForeignerPassportOrIdNumberstring optionalБрој пасоша / личне карте странца (предузетник)
classification: sensitive-pii -
entrepreneurForeignerIssuingCountrystring optionalДржава издавања (предузетник)
-
socialInsuranceBasisenum optionalThe sole proprietor's basis for compulsory social insurance registration with CROSO (M-form): as an unemployed person (activity is the basic insurance basis), from an existing employment relationship (activity is supplementary), or as a pensioner. This data is explicitly NOT a subject of registration itself -- it is collected only to feed the CROSO and Tax Administration applications the Agency files alongside registration. The source's three independent tick-boxes are modelled as a single mutually-exclusive choice.
enum: unemployed-basic-activity | employment-supplementary-activity | pensioner -
qualificationLevelenum requiredThe sole proprietor's education/qualification level code, per the form's own explicit instruction: "Обавезно уписати шифру стручне спреме предузетника" (Mandatory to enter the sole proprietor's qualification code) -- modelled as required despite the absence of a printed asterisk, since this instruction is unambiguous mandatory language. Like socialInsuranceBasis, this feeds CROSO's M-form and is not itself a subject of registration. The source's 14 independent tick-boxes are modelled as a single mutually-exclusive enum.
enum: 14 values -
individualProcuratorSexenum optionalПол (individual procurator)
enum: male | femaleclassification: pii -
individualProcuratorFirstNamestring optionalИме (individual procurator)
classification: pii -
individualProcuratorLastNamestring optionalПрезиме (individual procurator)
classification: pii -
individualProcuratorJmbgOrForeignerRecordNumberstring optionalЈМБГ / Евиденцијски број (individual procurator)
classification: sensitive-pii -
individualProcuratorForeignerPassportOrIdNumberstring optionalБрој пасоша / личне карте странца (individual procurator)
classification: sensitive-pii -
individualProcuratorForeignerIssuingCountrystring optionalДржава издавања (individual procurator)
-
individualProcuratorCountersignatureRestrictionboolean optionalWhether the individual procurator's authorization is restricted such that it may only be exercised jointly with the sole proprietor's countersignature. Per the form's own note, procuration cannot otherwise be restricted except through the consent of other procurators (joint procuration).
-
jointProcurator1Sexenum optionalПол (joint procurator 1)
enum: male | femaleclassification: pii -
jointProcurator1FirstNamestring optionalИме (joint procurator 1)
classification: pii -
jointProcurator1LastNamestring optionalПрезиме (joint procurator 1)
classification: pii -
jointProcurator1JmbgOrForeignerRecordNumberstring optionalЈМБГ / Евиденцијски број (joint procurator 1)
classification: sensitive-pii -
jointProcurator1ForeignerPassportOrIdNumberstring optionalБрој пасоша / личне карте странца (joint procurator 1)
classification: sensitive-pii -
jointProcurator1ForeignerIssuingCountrystring optionalДржава издавања (joint procurator 1)
-
jointProcurator2Sexenum optionalПол (joint procurator 2)
enum: male | femaleclassification: pii -
jointProcurator2FirstNamestring optionalИме (joint procurator 2)
classification: pii -
jointProcurator2LastNamestring optionalПрезиме (joint procurator 2)
classification: pii -
jointProcurator2JmbgOrForeignerRecordNumberstring optionalЈМБГ / Евиденцијски број (joint procurator 2)
classification: sensitive-pii -
jointProcurator2ForeignerPassportOrIdNumberstring optionalБрој пасоша / личне карте странца (joint procurator 2)
classification: sensitive-pii -
jointProcurator2ForeignerIssuingCountrystring optionalДржава издавања (joint procurator 2)
-
jointProcurator3Sexenum optionalПол (joint procurator 3)
enum: male | femaleclassification: pii -
jointProcurator3FirstNamestring optionalИме (joint procurator 3)
classification: pii -
jointProcurator3LastNamestring optionalПрезиме (joint procurator 3)
classification: pii -
jointProcurator3JmbgOrForeignerRecordNumberstring optionalЈМБГ / Евиденцијски број (joint procurator 3)
classification: sensitive-pii -
jointProcurator3ForeignerPassportOrIdNumberstring optionalБрој пасоша / личне карте странца (joint procurator 3)
classification: sensitive-pii -
jointProcurator3ForeignerIssuingCountrystring optionalДржава издавања (joint procurator 3)
-
branchLocation1ActivityCodestring optionalActivity code at separate operating location 1 of up to 3 printed on page 7; use as many copies of page 7 as needed for additional locations (per the form's own note).
pattern -
branchLocation1ActivityNamestring optionalНазив делатности (издвојено место)
-
branchLocation1Municipalitystring optionalОпштина (издвојено место)
-
branchLocation1Placestring optionalМесто (издвојено место)
-
branchLocation1Streetstring optionalУлица (издвојено место)
-
branchLocation1HouseNumberstring optionalБрој (издвојено место)
-
branchLocation1HouseLetterstring optionalСлово (издвојено место)
-
branchLocation1Floorstring optionalСпрат (издвојено место)
-
branchLocation1ApartmentNumberstring optionalБрој стана (издвојено место)
-
branchLocation1PostalCodestring optionalБрој поште (издвојено место)
-
branchLocation1PostOfficeNamestring optionalНазив поште (издвојено место)
-
branchLocation1AdditionalDescriptionstring optionalE.g. market name, stall number, or unit number.
-
branchLocation2ActivityCodestring optionalActivity code at separate operating location 2 of up to 3 printed on page 7; use as many copies of page 7 as needed for additional locations (per the form's own note).
pattern -
branchLocation2ActivityNamestring optionalНазив делатности (издвојено место)
-
branchLocation2Municipalitystring optionalОпштина (издвојено место)
-
branchLocation2Placestring optionalМесто (издвојено место)
-
branchLocation2Streetstring optionalУлица (издвојено место)
-
branchLocation2HouseNumberstring optionalБрој (издвојено место)
-
branchLocation2HouseLetterstring optionalСлово (издвојено место)
-
branchLocation2Floorstring optionalСпрат (издвојено место)
-
branchLocation2ApartmentNumberstring optionalБрој стана (издвојено место)
-
branchLocation2PostalCodestring optionalБрој поште (издвојено место)
-
branchLocation2PostOfficeNamestring optionalНазив поште (издвојено место)
-
branchLocation2AdditionalDescriptionstring optionalE.g. market name, stall number, or unit number.
-
branchLocation3ActivityCodestring optionalActivity code at separate operating location 3 of up to 3 printed on page 7; use as many copies of page 7 as needed for additional locations (per the form's own note).
pattern -
branchLocation3ActivityNamestring optionalНазив делатности (издвојено место)
-
branchLocation3Municipalitystring optionalОпштина (издвојено место)
-
branchLocation3Placestring optionalМесто (издвојено место)
-
branchLocation3Streetstring optionalУлица (издвојено место)
-
branchLocation3HouseNumberstring optionalБрој (издвојено место)
-
branchLocation3HouseLetterstring optionalСлово (издвојено место)
-
branchLocation3Floorstring optionalСпрат (издвојено место)
-
branchLocation3ApartmentNumberstring optionalБрој стана (издвојено место)
-
branchLocation3PostalCodestring optionalБрој поште (издвојено место)
-
branchLocation3PostOfficeNamestring optionalНазив поште (издвојено место)
-
branchLocation3AdditionalDescriptionstring optionalE.g. market name, stall number, or unit number.
-
remarkCategoryenum optionalCategory of an optional register annotation (забележба): fixed working hours of a private practice, or a free-text "other" category (requiring remarkOtherCategorySpecify).
enum: private-practice-hours | other -
remarkOtherCategorySpecifystring optionalFree-text specification of the remark category, used only when remarkCategory is "other".
-
remarkTextProvidedboolean optionalToggle indicating that the text of the register annotation is provided in remarkText.
-
remarkTextstring optionalFree-text content of the register annotation.
-
taxAuthorityPhoneFixedstring optionalFixed-line phone number for Tax Administration contact purposes. Per the form's own note, at least one of taxAuthorityPhoneFixed/taxAuthorityPhoneMobile is mandatory; not machine-enforced here since the Condition grammar has no clean "at least one of two optional fields" construct.
-
taxAuthorityPhoneMobilestring optionalMobile phone number for Tax Administration contact purposes. See taxAuthorityPhoneFixed for the at-least-one-of rule.
-
taxAuthorityEmailstring requiredE-mail address for Tax Administration contact purposes, an explicitly mandatory data point used by the Tax Administration to verify reachability of newly-founded taxpayers (distinct from applicantEmail on page 1 and businessEmailAddress on page 3, though likely the same address in practice).
pattern -
lumpSumTaxationRequestedboolean optionalRequest that tax on income from independent activity be paid on a lump-sum-determined income (паушално утврђен приход), on the basis that the sole proprietor is unable to keep business books (or keeping them would substantially impede the activity), except for the register-of-turnover book. Mutually exclusive with personalSalaryPayoutElection per the form's own note (electing one forfeits eligibility for the other).
-
personalSalaryPayoutElectionboolean optionalElection, by a sole proprietor who keeps business books, to pay out a personal salary. Mutually exclusive with lumpSumTaxationRequested per the form's own note.
-
vatRegistrationRequestedboolean optionalWhether the applicant is also submitting an application for registration as a value-added-tax payer.
-
vatEstimatedTurnover12Monthsnumber optionalEstimated total turnover, in dinars without decimals, over the next 12 months. Per the form's own note, must be at least 8,000,001.00 dinars.
range: 8000001–∞ -
vatPrimaryActivityCodestring optionalШифра претежне делатности (ПДВ)
-
vatPrimaryActivityPercentagenumber optionalПроценат обављања претежне делатности (ПДВ)
range: 0–100 -
vatAdditionalActivity1Codestring optionalШифра додатне делатности 1 (ПДВ)
-
vatAdditionalActivity1Percentagenumber optionalПроценат обављања додатне делатности 1 (ПДВ)
range: 0–100 -
vatAdditionalActivity2Codestring optionalШифра додатне делатности 2 (ПДВ)
-
vatAdditionalActivity2Percentagenumber optionalПроценат обављања додатне делатности 2 (ПДВ)
range: 0–100 -
activityPermitReferenceNumberAndDatestring optionalReference number and issue date of the permit/consent/act named in the activityPermitOrLicense document, entered instead of attaching a copy when a publicly-accessible official record of issued permits already exists.
-
otherDocumentDescriptionstring optionalFree-text description of the document attached under the otherSupportingDocument checklist entry.
Verification record
This file is the source-review record for this document version, per the manual-source-review-v1 practice.
Current claim
status:draftverification.method:manual-source-review-v1verification.lastVerifiedAt:2026-07-13maturity.level:structural-reference
This is GovSchema Standard Research cycle GOV-2725 (parent research cycle GOV-2723), authoring the child issue named in GOV-2716's own cycle: GOV-2716 scouted Serbia (via APR's JRPPS-PR sole-proprietor registration) to a strong, ready-to-author candidate and logged it in CATALOG.md's "Known Gaps & Opportunities" section rather than authoring it immediately. This schema opens Serbia as the registry's 48th jurisdiction, via Business Formation.
Duplicate-concurrent-run check
Checked gh pr list --state all --search "apr" and git branch -a | grep -i rs-apr before starting — neither found an existing rs/apr PR or branch beyond this run's own rs-apr-jrpps-pr-gov2725, so no reconciliation was needed this cycle.
Source verification — re-fetched from scratch, not trusted from the prior cycle
The task briefing flagged that apr.gov.rs is intermittently flaky and instructed a retry loop rather than trusting the prior cycle's numbers at face value. This cycle's own re-fetch found the live host fully down, not merely flaky:
- A retry loop of the source PDF URL directly (
https://apr.gov.rs/upload/Portals/0/preduzetnici/2025/JRPPS_PR___Osnivanje_2025_T.pdf) returned HTTP 500 on all 23 consecutive attempts (spread across two batches, with 3-5s backoff and a browser-likeUser-Agent), each time returning the same 39,174-byte generic IIS/ASP.NET error page (confirmed by inspecting the response body, which begins<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"...), not a truncated/corrupt PDF. - A direct fetch of the bare domain root (
https://apr.gov.rs/) also returned HTTP 500, confirming this is a site-wide outage rather than a path-specific or transient glitch, and ruling out a simple retry-until-200 approach. - Fell back to the Wayback Machine as the task briefing's own retry-loop instruction did not anticipate a full site outage. The CDX API (
web.archive.org/cdx/search/cdx?url=...&output=json) lists 8 snapshots between 2025-05-06 and 2025-09-18, all but one sharing the identical CDX content digestIXDQYCQOK7CEUNBQ7T37KMQQB4GEGREA.- Fetched the most recent snapshot (
web.archive.org/web/20250918034911id_/http://www.apr.gov.rs/upload/Portals/0/preduzetnici/2025/JRPPS_PR___Osnivanje_2025_T.pdf) via both theid_(raw, unmodified) andif_(iframe-embeddable) Wayback replay modifiers: byte-identical, confirming the replay modifier does not alter PDF content (unlike HTML pages, which Wayback sometimes banner-injects). - Cross-checked against an independent, much-earlier snapshot (
20250506092155, a different calendar month): also byte-identical to the 20250918 snapshot. - sha256:
0a7ebff903fa896a6b8c3d14f440d087aa7ec341cdb25cfe04b8b04bd0cc69ca, 412,964 bytes, valid%PDF-1.7header. This is a different byte-size than the prior cycle's own scouting figure and than any single CDXlengthcolumn value (which records WARC-record length, not object length, so is not directly comparable) — since three independent fetches (two Wayback replay modes, two snapshot dates) all agree byte-for-byte, this is treated as the authoritative current content, not a red flag.
- Fetched the most recent snapshot (
PDF structure, confirmed via pdfjs-dist 3.11.174 (legacy build)
- 10 pages, confirmed genuinely AcroForm-fillable:
doc.getFieldObjects()returns 244 distinct field names (260 total field-object entries, since AcroForm radio-button groups share one field name across multiple per-value widgets). Of these, 197 distinct field names are actually anchored to a visible page (211 visible widget entries across pages 1-10); the remaining ~47 names are orphaned parent/master field definitions with no page assignment (page: -1), an artifact of the shared multi-entity-type JRPPS AcroForm template this PR-specific PDF was generated from (e.g. bareText33,Text34, ... exist as unused parents alongside their real, page-anchoredText33.0/Text33.1children). - Rendered all 10 pages to PNG via
pdfjs-dist+node-canvas(2.5x scale) and visually cross-checked every widget'srectagainst the rendered page before modeling any field — not just correlating (x, y) text positions blindly. This caught two structural details that text-position correlation alone would have gotten wrong or missed:- Page 1's register-selection group (
Radio Button1, 11 mutually exclusive tick-boxes: Register of Business Entities, of foreign associations, of sports federations/societies, of bankruptcy estates, of endowments/foundations, of chambers of commerce, of associations, of representative offices of foreign endowments/foundations, of representative offices of foreign chambers of commerce, of health institutions, of culture institutions) is a real, single-choice AcroForm radio group (true PDF radio-button kids sharing one field name with distinct export values), not the "independently-named sibling widgets" checkbox-group quirk this registry has seen elsewhere. It is nonetheless excluded fromfields[]: this specific PDF (filenameJRPPS_PR) is the sole-proprietor-only edition of JRPPS, and a sole proprietor filing through it always registers in the Register of Business Entities — the other 10 options describe entity types wholly out of scope for this schema. Modeling it as an 11-value open enum would misrepresent this pathway's actual decision space (there is no real choice here for apreduzetnikfiler). - On page 3, the СЕДИШТЕ (seat) address's "
*Број:" (house number) label spans two adjacent text widgets (Text36.0,Text37.0) with no distinguishing sub-label of its own — visually confirmed via an overlay render (widget rects drawn directly on the rendered page) that both widgets sit inside what appears as a single continuous input box. This is inconsistent with every other address block on this form (the applicant's page-1 address, the page-3 postal-receipt address, and each of the three page-7 branch-location addresses), all of which print a single combined "Број и слово:" (Number and letter) label over exactly two widgets, one per named concept. Modeled as: the first widget (Text36.0) →seatHouseNumber(matching the "Број:"-only label, one concept); the second widget (Text37.0) is excluded as an unlabeled structural duplicate rather than invented a "suffix" or "letter" meaning it has no printed support for — the seat's actual letter suffix is captured separately by the adjacent, clearly-labeledслово:widget (Text23), which does have its own field (seatHouseLetter).
- Page 1's register-selection group (
- Every other repeating checkbox/radio group on this form follows the registry's already-documented quirk (independently-named sibling widgets standing in for a single-choice concept) and is modeled by intent, not raw plumbing, per the task briefing's own instruction — e.g.
businessNameDesignation(пословно име: "ПРЕДУЗЕТНИК" vs. "ПР"),businessActivityStartOption,socialInsuranceBasis,qualificationLevel(14 tick-boxes → one enum), and each translation block's foreign-language/national-minority-language pair.
Field-scoping judgment calls
- Two overlapping "seat" fields, on different pages, both kept.
registeredSeatPlace(page 2, part of the business-name construction: "Пословно име ... и место у ком је седиште предузетника") andseatMunicipality/seatPlace/seatStreet/etc. (page 3, the full СЕДИШТЕ address block) both capture the seat, but are genuinely separate AcroForm widgets appearing at different points in the source document. Both are modeled rather than silently merged, with the overlap disclosed onregisteredSeatPlace's owndescription. - Three distinct e-mail fields, all kept.
applicantEmail(page 1, optional, the submitter's own contact e-mail — the submitter may be a proxy, not the sole proprietor),businessEmailAddress(page 3, required, "Адреса за пријем електронске поште је обавезан предмет регистрације" — the business's official e-mail of record) andtaxAuthorityEmail(page 9, required, collected specifically so the Tax Administration can verify reachability of newly-founded taxpayers) are three separate widgets on the source, likely the same address in practice but not guaranteed to be, and are modeled as three separate fields with cross-references disclosed in each one's owndescription. coverPageBusinessName(page 1, "НАЗИВ:"). Ambiguous relative to the page-2 componentized business-name construction; disclosed as a judgment call on the field's owndescriptionrather than silently assumed equivalent or dropped. The adjacent "МЕСТО ЗА БАРКОД / додељује АПР" (barcode area, assigned by APR) is excluded as staff/system-populated.qualificationLevelmodeledrequired: truedespite no printed asterisk. The form's own instructional text is unambiguous mandatory language — "Обавезно уписати шифру стручне спреме предузетника" (Mandatory to enter the sole proprietor's qualification code) — even though this section (likesocialInsuranceBasis) is explicitly stated to not itself be a subject of registration, only data collected to feed the CROSO M-form and Tax Administration applications APR files alongside registration. This is the one field in the schema markedrequired: truewithout a printed asterisk; every other required-field determination follows the source's own asterisk convention.- "At least one of two phone numbers" not machine-enforced. Page 9 states "*(обавезно унети један од телефонских бројева)" (mandatory to enter one of the phone numbers) for
taxAuthorityPhoneFixed/taxAuthorityPhoneMobile. GSP-0013's Condition grammar has no clean "at least one of two independently-optional fields" construct (onlyrequiredWhengated on a single condition, orcrossFieldValidation'srequirePresentunder awhengate) — encoding this would require an artificial helper condition not grounded in any real form field, so this business rule is disclosed in both fields' owndescriptionrather than structurally enforced, consistent with this repository's establishednotEquals-against-an-absent-field avoidance discipline (no field-absence operator exists in the grammar). businessFantasyName→businessActivityDescriptioncross-requirement disclosed, not enforced. The form states that if aНазив(fantasy name) is entered,Предмет пословања(business activity description) must also be entered. Encoding this asrequiredWhen: { field: businessFantasyName, notEquals: "" }would trigger this registry's known bug class (no field-absence operator;notEquals ""against anundefinedvalue evaluatestrueregardless, making the field effectively always-required) — disclosed inbusinessFantasyName's owndescriptioninstead.activityPermitOrLicense/procurationWrittenAuthorizationconditional documents leftrequired: false, notrequiredWhen-gated. Both are genuinely conditional per the page-10 checklist's own prose (on regulated-activity status and on whether a procuration was granted, respectively), but neither condition is backed by a single boolean field infields[]that cleanly captures it (procurator fields are all optional strings; there is no single "activity requires a permit" toggle) — modeledrequired: falsewith the condition disclosed in each document's owndescription, mirroring this registry'srw/rdbprecedent forevidenceOfPaymentOfFee.- Two
attestation-categorydocuments[]entries, each anchored to a verbatim printed statement (SPEC §9.1).applicantSignaturequotes page 1's own declaration ("Потписивањем регистрационе пријаве подносилац одговара за тачност унетих података.") and isrequired: true. A second, narrower attestation,vatRegistrationApplicantSignature, quotes page 9's own VAT-specific declaration ("ПОДНОСИМ ПРИЈАВУ ЗА ЕВИДЕНТИРАЊЕ ОБВЕЗНИКА ПОРЕЗА НА ДОДАТУ ВРЕДНОСТ") and isrequiredWhen vatRegistrationRequested equals true— a distinct declaration/signature line specific to the optional VAT sub-request, not a duplicate of the page-1 signature. - Bounded repeating groups, not open-ended arrays. Page 6 (procurators: 1 individual + up to 3 joint) and page 7 (up to 3 branch/separate operating locations) are each modeled as a fixed number of flat, numbered fields (
jointProcurator1FirstName..jointProcurator3...,branchLocation1ActivityCode..branchLocation3...), matching the source's own printed capacity per page and its own instruction to photocopy additional copies of that page for further repetitions beyond what is printed — consistent with this registry's established bounded-repeating-group convention (cf. Denmark/FinlandentrantN/childNprecedent). predominantActivityCode/branchActivityCodepattern. Modeled withvalidation.pattern: "^\\d{4}$", matching the form's own comb-style 4-box digit entry and its instructional text ("...навођењем одговарајуће четвороцифрене шифре...", four-digit code).vatEstimatedTurnover12Monthsminimum. Modeled withvalidation.minimum: 8000001, matching the form's own printed floor ("*обавезно унети податак у износу од најмање 8.000.001,00 динара или више").
Conformance fixtures
Two valid scenarios (0 errors each) plus nine mutation-control fixtures (each raising exactly one error), committed under conformance/rs/apr/jrpps-pr-sole-proprietor-registration/1.0.0/, checked with a purpose-written ad hoc script (validate_instance.mjs, mirroring this registry's established per-session pattern since no committed conformance-fixture validator exists): performs static required/type/ pattern/enum/minimum/maximum checks plus a from-scratch evaluator for the shared Condition grammar (requiredWhen/documents[].requiredWhen/ exclusivityGroups).
``` $ node validate_instance.mjs schema.json sole-proprietor-indefinite-lump-sum-no-vat.json sole-proprietor-indefinite-lump-sum-no-vat.json: 0 error(s)
$ node validate_instance.mjs schema.json sole-proprietor-fixed-term-vat-with-procurator.json sole-proprietor-fixed-term-vat-with-procurator.json: 0 error(s)
$ node validate_instance.mjs schema.json mutation-control-missing-required-field.json mutation-control-missing-required-field.json: 1 error(s) MISSING REQUIRED: entrepreneurFullName
$ node validate_instance.mjs schema.json mutation-control-invalid-enum-value.json mutation-control-invalid-enum-value.json: 1 error(s) VALIDATION ERROR: businessNameDesignation: value "sole-trader" not in enum ["preduzetnik","pr"]
$ node validate_instance.mjs schema.json mutation-control-invalid-date-format.json mutation-control-invalid-date-format.json: 1 error(s) TYPE ERROR: registeredUntilDate: expected ISO date string, got "31-12-2030"
$ node validate_instance.mjs schema.json mutation-control-email-pattern-violation.json mutation-control-email-pattern-violation.json: 1 error(s) VALIDATION ERROR: businessEmailAddress: value "not-an-email" does not match pattern ^[^@\s]+@[^@\s]+\.[^@\s]+$
$ node validate_instance.mjs schema.json mutation-control-missing-conditional-registered-until-date.json mutation-control-missing-conditional-registered-until-date.json: 1 error(s) MISSING REQUIRED: registeredUntilDate
$ node validate_instance.mjs schema.json mutation-control-missing-conditional-apr-org-unit-name.json mutation-control-missing-conditional-apr-org-unit-name.json: 1 error(s) MISSING REQUIRED: aprOrgUnitName
$ node validate_instance.mjs schema.json mutation-control-missing-conditional-vat-primary-activity-code.json mutation-control-missing-conditional-vat-primary-activity-code.json: 1 error(s) MISSING REQUIRED: vatPrimaryActivityCode
$ node validate_instance.mjs schema.json mutation-control-missing-required-document.json mutation-control-missing-required-document.json: 1 error(s) MISSING REQUIRED DOCUMENT: proofOfIdentity
$ node validate_instance.mjs schema.json mutation-control-exclusivity-group-violation.json mutation-control-exclusivity-group-violation.json: 1 error(s) EXCLUSIVITY GROUP VIOLATION: lumpSumVsPersonalSalaryElection: more than one of ["lumpSumTaxationRequested","personalSalaryPayoutElection"] is true ```
Both meta-schema validators were run against the finished document and pass clean:
``` $ node tools/validate.mjs registry/rs/apr/jrpps-pr-sole-proprietor-registration/1.0.0/schema.json ok registry/rs/apr/jrpps-pr-sole-proprietor-registration/1.0.0/schema.json 1/1 document(s) passed.
$ node tools/validate-ajv.mjs registry/rs/apr/jrpps-pr-sole-proprietor-registration/1.0.0/schema.json ok registry/rs/apr/jrpps-pr-sole-proprietor-registration/1.0.0/schema.json [v0.3] 1/1 document(s) validated against the meta-schema (ajv 2020-12). ```
tools/govschema-client/registry-index.json was regenerated via npm run build-index (in tools/govschema-client/, after npm ci --include=dev since a plain npm ci under a local NODE_ENV=production skips ajv's devDependency install) to include this document's entry.
Serbia's other verticals
Serbia opens at 1 of 6 verticals (Business Formation) via this schema. DMV, Taxes, Visa, National ID, and Passport are open, unscreened backlog candidates for future cycles.
View the raw record (VERIFICATION.md)
Version history
-
1.0.0draftlatestthis pagehas verification recordschema.json
Independent and non-affiliated
GovSchema is an independent, open-source project. This reference is not produced, reviewed, or endorsed by Agencija za privredne registre (Agency for Business Registers) or any government. The authoritative source is always the live government form and its official instructions.