{"templateId":"../@theme/Templates/BlogWithAuthors","sharedDataIds":{"sidebar":"sidebar-blog/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"What you are building","description":"Developer documentation for the Caraer platform. REST API reference, Bearer authentication, tutorials, and guides for records, forms, webpages, webhooks, and automations.","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This tutorial shows how public form submission works in Caraer and how to"," ","implement a website form flow using the Forms API."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-you-are-building","__idx":0},"children":["What you are building"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fetch a public form definition"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Render fields in your website frontend"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Upload files if needed"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Submit form values to Caraer"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Persist submissions as records according to your form configuration"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"core-endpoints-for-public-forms","__idx":1},"children":["Core endpoints for public forms"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["From ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FormController"]},":"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/v2/forms/public/{companyUuid}/{formUuid}"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /api/v2/forms/public/{companyUuid}/{formUuid}/upload"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /api/v2/forms/public/{companyUuid}/{formUuid}/submit"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /api/v2/forms/public/{companyUuid}/{propertyUuid}/options"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["From ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WebpageController"]}," (for CMS-driven pages that include forms and dynamic"," ","content):"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/v2/webpages/public/{rootSlug}/{slug}"]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-1-fetch-the-public-form","__idx":2},"children":["Step 1: Fetch the public form"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X GET \"https://your-company.caraer.com/api/v2/forms/public/COMPANY_UUID/FORM_UUID\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This returns a public DTO version of the form that your frontend can render."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"understand-the-form-structure-before-rendering","__idx":3},"children":["Understand the form structure before rendering"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The public form payload is structured, not just a flat field list. At a high"," ","level it contains:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]},": the target Caraer object this form submits into"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grids"]},": ordered form sections/steps in case of a wizard otherwise just one grid"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["description"]},": form-level helper text"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["styling"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["standard"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["underline"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plain"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["wizard"]},": whether the form is multi-step"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["metadata"]},": arbitrary key-value metadata"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["thankYouMessage"]},": post-submit success message"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["redirectUrl"]},": optional URL to redirect to after submit"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"how-grids-are-organized","__idx":4},"children":["How ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grids"]}," are organized"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each item in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grids"]}," is a section model (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FormItem"]},") with:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["title"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["description"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["section"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["step"]},"): Sections represent an introduction or informational \"slide\" in the form wizard and do ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," contain any fields for data entry—they are used for welcome screens or instructions only. Steps, by contrast, contain the actual fields to be completed by the user."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grid"]}," (two-dimensional array)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grid"]}," is important:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["outer array = rows"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["inner array = cells in a row"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each cell (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GridItem"]},") can hold one of:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["property"]}," (actual input field mapped to a property)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["text"]}," (static content/instruction)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["form"]}," (nested form)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["submitButton"]}," (button label)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["settings"]}," (UI and behavior options like required, placeholder, help text)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Example shape (simplified):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"object\": { \"uuid\": \"...\" },\n  \"wizard\": true,\n  \"grids\": [\n    {\n      \"title\": \"Personal details\",\n      \"type\": \"step\",\n      \"grid\": [\n        [\n          { \"property\": { \"uuid\": \"prop-firstname\", \"name\": \"firstname\" } },\n          { \"property\": { \"uuid\": \"prop-lastname\", \"name\": \"lastname\" } }\n        ],\n        [\n          {\n            \"property\": { \"uuid\": \"prop-email\", \"name\": \"email\" },\n            \"settings\": {\n              \"required\": true,\n              \"placeholder\": \"you@example.com\",\n              \"helpText\": \"We only use this for application updates.\"\n            }\n          }\n        ],\n        [{ \"submitButton\": \"Submit application\" }]\n      ]\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"practical-constraints-to-account-for","__idx":5},"children":["Practical constraints to account for"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Non-wizard forms support a single grid section."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A form should only have one submit button in total."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Field validation happens on submit against property type/format rules."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-nested-forms-work","__idx":6},"children":["How nested forms work"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A grid cell can contain a full nested form instead of a single property. This is"," ","used when one submission should create a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["parent record"]}," plus one or more"," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["related records"]}," — for example, a Candidate form that also collects Work"," ","Experience or Education entries inline."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"what-you-receive-in-the-form-definition","__idx":7},"children":["What you receive in the form definition"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When a cell holds a nested form, the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["form"]}," key replaces ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["property"]},". The value"," ","is a complete nested form payload (with its own ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grids"]},", and fields)."," ","The cell also includes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["settings.relation"]},", which tells Caraer how to link the"," ","nested form's record to the parent record after submission."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"[\n  { \"property\": { \"uuid\": \"prop-firstname\", \"name\": \"firstname\" } },\n  {\n    \"form\": {\n      \"uuid\": \"nested-work-experience-uuid\",\n      \"object\": { \"uuid\": \"...\", \"name\": \"WorkExperience\" },\n      \"grids\": [\n        {\n          \"type\": \"step\",\n          \"grid\": [\n            [\n              { \"property\": { \"uuid\": \"prop-company\", \"name\": \"company\" } },\n              { \"property\": { \"uuid\": \"prop-role\", \"name\": \"role\" } }\n            ]\n          ]\n        }\n      ]\n    },\n    \"settings\": {\n      \"relation\": { \"uuid\": \"...\", \"name\": \"has_work_experience\" }\n    }\n  }\n]\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["settings.relation"]}," is required for nested forms. Without it, the form"," ","configuration is invalid."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"rendering-nested-forms","__idx":8},"children":["Rendering nested forms"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Treat nested forms as recursive mini-forms:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["When you encounter a cell with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["form"]},", render that nested form's step grid"," ","(typically the grid where ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["step"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Render nested form fields the same way you render top-level fields (same"," ","property types, settings, and options endpoint behavior)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Nested forms can themselves contain nested forms — keep rendering"," ","recursively until you reach property cells."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the same nested form appears more than once in a parent form (for example,"," ","two work-experience blocks), give each instance a stable index so field values"," ","do not overwrite each other. A common pattern is to namespace fields by nested"," ","form UUID and index:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Non-wizard parent: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nested-work-experience-uuid[0].company"]},","," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nested-work-experience-uuid[1].company"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Wizard parent: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["step-work-history.nested-work-experience-uuid[0].company"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"submitting-nested-form-values","__idx":9},"children":["Submitting nested form values"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On submit, keep the same overall form structure you fetched — do not flatten"," ","nested fields to the parent level. Values belong on the nested form's property"," ","cells inside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["form.grids"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For each nested form instance:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Locate the corresponding ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["form"]}," cell in the parent grid."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Walk the nested form's grids recursively."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["value"]}," on each nested property cell (and optionally on"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["property.value"]},")."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Example submit fragment with one nested form instance:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"property\": { \"uuid\": \"prop-firstname\", \"name\": \"firstname\" },\n  \"value\": \"Jane\"\n},\n{\n  \"form\": {\n    \"uuid\": \"nested-work-experience-uuid\",\n    \"object\": { \"uuid\": \"...\", \"name\": \"WorkExperience\" },\n    \"grids\": [\n      {\n        \"type\": \"step\",\n        \"grid\": [\n          [\n            {\n              \"property\": { \"uuid\": \"prop-company\", \"name\": \"company\" },\n              \"value\": \"Acme Corp\"\n            },\n            {\n              \"property\": { \"uuid\": \"prop-role\", \"name\": \"role\" },\n              \"value\": \"Software Engineer\"\n            }\n          ]\n        ]\n      }\n    ]\n  },\n  \"settings\": {\n    \"relation\": { \"uuid\": \"...\", \"name\": \"has_work_experience\" }\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When the same nested form UUID appears multiple times, preserve grid order and"," ","map each instance to the matching index in your frontend state"," ","(",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[0]"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[1]"]},", etc.)."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"what-caraer-does-after-submit","__idx":10},"children":["What Caraer does after submit"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The backend processes nested forms in two stages:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Parent record"]}," — fields on the outer form are validated and saved to the"," ","parent form's target object."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Inner forms"]}," — for each grid cell containing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["form"]},", Caraer submits that"," ","nested form as its own submission, creates a record for the nested form's"," ","object, and links it to the parent record using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["settings.relation"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This means nested form fields are ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," stored on the parent record. They"," ","become separate related records in your graph."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"nested-form-pitfalls","__idx":11},"children":["Nested form pitfalls"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Omitting ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["settings.relation"]}," on nested form cells."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Flattening nested values to the parent payload instead of nesting them under"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["form.grids"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reusing the same field namespace for multiple nested form instances, causing"," ","values to collide."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Expecting nested form properties to appear on the parent record after submit."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-2-render-the-form-in-your-website","__idx":12},"children":["Step 2: Render the form in your website"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implementation checklist:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Build a field renderer based on form field types"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Respect required/optional field behavior from the payload"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["For select-like fields that require dynamic options, call the public options"," ","endpoint"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Keep field keys aligned with form property UUIDs/names expected by the API"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-3-upload-files-first-if-your-form-has-file-inputs","__idx":13},"children":["Step 3: Upload files first (if your form has file inputs)"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST \"https://your-company.caraer.com/api/v2/forms/public/COMPANY_UUID/FORM_UUID/upload\" \\\n  -F \"files=@resume.pdf\" \\\n  -F \"files=@motivation-letter.pdf\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The API returns uploaded file keys. Include those keys in the final form"," ","payload where your file fields expect them."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-4-submit-the-form","__idx":14},"children":["Step 4: Submit the form"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST \"https://your-company.caraer.com/api/v2/forms/public/COMPANY_UUID/FORM_UUID/submit\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"object\": { \"uuid\": \"...\" },\n  \"wizard\": true,\n  \"grids\": [\n    {\n      \"title\": \"Personal details\",\n      \"type\": \"step\",\n      \"grid\": [\n        [\n          { \"property\": { \"uuid\": \"prop-firstname\", \"name\": \"firstname\" }, \"value\": \"Jane\" },\n          { \"property\": { \"uuid\": \"prop-lastname\", \"name\": \"lastname\" }, \"value\": \"Doe\" }\n        ],\n        [\n          {\n            \"property\": { \"uuid\": \"prop-email\", \"name\": \"email\" },\n            \"settings\": {\n              \"required\": true,\n              \"placeholder\": \"you@example.com\",\n              \"helpText\": \"We only use this for application updates.\"\n            },\n            \"value\": \"jane.doe@example.com\"\n          }\n        ],\n        [{ \"submitButton\": \"Submit application\" }]\n      ]\n    }\n  ]\n}'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On success, you receive a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SuccessResponse"]}," containing a submission UUID."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For detailed type/format submission rules (for example semicolon-delimited"," ","multi-select/tag values, range format, structure JSON string, and date"," ","submission rules), see:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/blog/2026-03-25-save-records#how-to-submit-values-by-property-type-and-format"},"children":["How to submit values by property type and format"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-this-connects-to-records","__idx":15},"children":["How this connects to records"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you submit a form via the Caraer API, the payload isn't just stored as a flat submission but is processed by the backend FormService. This service performs validation and then creates or updates actual objects (records) in your configured Caraer data model, linking the form data to your business entities."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A special case is when you want to track where or how the conversion happened—for example, relating a candidate submission to a specific web page or campaign. Caraer provides a key called ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["conversionPageRecordUuid"]}," for this. If you include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["conversionPageRecordUuid"]}," in your form payload, the backend FormService will use it to create a relation between the submitted record (such as a Candidate or Lead) and the page record where the conversion originated."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["To make this work in your integration:"]}]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In your form submission payload, add the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["conversionPageRecordUuid"]}," inside the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["metadata"]}," object rather than at the top level. For example:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":" {\n   // ...existing form data\n   \"metadata\": {\n     \"conversionPageRecordUuid\": \"THE_TARGET_PAGE_RECORD_UUID\"\n   }\n }\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"ol","attributes":{"start":2},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Make sure the referenced page record UUID exists and your API token has access."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Caraer will then link the submitted record to this page in the backend automatically as part of the submission."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["You can view or filter such relations later via the records API, using relation queries."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Note:"]}," Other relations (e.g., linking a record to a vacancy or source) work similarly—the FormService picks up relation fields from the payload or object/form definition and creates the links in the graph as part of post-processing, using the same internal service methods."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For direct manipulation and relation management ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["outside"]}," forms, use the Records endpoints as described in the dedicated records guide."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"common-pitfalls","__idx":16},"children":["Common pitfalls"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Submitting files directly inside submit payload without uploading first."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Mismatch between frontend field keys and backend form schema."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Forgetting to fetch dynamic options for relation/select-like fields."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Flattening nested form values instead of nesting them under ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["form.grids"]}," (see"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#how-nested-forms-work"},"children":["How nested forms work"]},")."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"related-reading","__idx":17},"children":["Related reading"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/blog/2026-03-25-save-records"},"children":["Save records"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/apis"},"children":["API reference"]}]}]}]},"headings":[{"value":"What you are building","id":"what-you-are-building","depth":2},{"value":"Core endpoints for public forms","id":"core-endpoints-for-public-forms","depth":2},{"value":"Step 1: Fetch the public form","id":"step-1-fetch-the-public-form","depth":2},{"value":"Understand the form structure before rendering","id":"understand-the-form-structure-before-rendering","depth":2},{"value":"How grids are organized","id":"how-grids-are-organized","depth":3},{"value":"Practical constraints to account for","id":"practical-constraints-to-account-for","depth":3},{"value":"How nested forms work","id":"how-nested-forms-work","depth":2},{"value":"What you receive in the form definition","id":"what-you-receive-in-the-form-definition","depth":3},{"value":"Rendering nested forms","id":"rendering-nested-forms","depth":3},{"value":"Submitting nested form values","id":"submitting-nested-form-values","depth":3},{"value":"What Caraer does after submit","id":"what-caraer-does-after-submit","depth":3},{"value":"Nested form pitfalls","id":"nested-form-pitfalls","depth":3},{"value":"Step 2: Render the form in your website","id":"step-2-render-the-form-in-your-website","depth":2},{"value":"Step 3: Upload files first (if your form has file inputs)","id":"step-3-upload-files-first-if-your-form-has-file-inputs","depth":2},{"value":"Step 4: Submit the form","id":"step-4-submit-the-form","depth":2},{"value":"How this connects to records","id":"how-this-connects-to-records","depth":2},{"value":"Common pitfalls","id":"common-pitfalls","depth":2},{"value":"Related reading","id":"related-reading","depth":2}],"frontmatter":{"title":"Submit forms and embed forms on your website","authors":["sem_tadema"],"tags":["tutorial","api-tutorial"],"template":"../@theme/Templates/BlogWithAuthors","seo":{"title":"What you are building"}},"lastModified":"2026-06-05T13:59:15.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/blog/2026-03-25-submit-forms-and-embed-on-your-website","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}