# Nyckel > Nyckel lets developers create machine learning functions that classify, > detect, search, and predict from images, text, structured data, and > multimodal inputs, then improve automatically from annotated production > samples. Nyckel provides machine learning functions that classify, detect, search, and predict from images, text, structured data, or multimodal inputs through a simple API. A machine learning function is a hosted endpoint that recognizes patterns in data and returns predictions. Developers define the task, labels, and examples; Nyckel handles model selection, training, optimization, hosting, and deployment. Nyckel can use foundation models to produce initial predictions before any training data is collected — teams start invoking the function immediately and improve accuracy over time by reviewing and annotating real production samples. ## What you can build ### Start simple (5 minutes) Create a function, define a few labels, and start invoking it from your app. Zero-shot foundation models give you usable predictions on day one — no training data required. - Add image classification to an app prototype - Route support tickets to the right team - Tag user-uploaded content ### Make it better (an afternoon) As real traffic flows through the function, capture samples, review the ones the model was uncertain about, and correct their labels. Nyckel retrains automatically — accuracy climbs without you managing the model. - Reach production-grade accuracy on your most common categories - Catch and fix systematic mistakes before they spread - Build a labeled dataset as a byproduct of normal usage ### Production scale (when you need it) Use Sample Sets to group held-out evaluation data, function summaries to track training progress, and search/detect/multimodal function types when classification isn't enough. - Run regression checks before promoting a new model version - Build a semantic search index over a product catalog - Combine images with structured metadata for higher-fidelity predictions ## The minimal path — get a function working in five calls 1. **Create a Function** — `POST /v1/functions` Create the function. Choose input modality (Text/Image/Tabular) and output modality (Classification/Detection/Search/etc) — these are immutable. https://www.nyckel.com/docs/api/operations/post-function/ 2. **Create a Label** — `POST /v1/functions/{functionId}/labels` Define the categories the function can predict. Repeat for each label. https://www.nyckel.com/docs/api/operations/post-label/ 3. **Invoke a Function** — `POST /v1/functions/{functionId}/invoke` Send input data and get a prediction. Works zero-shot from the first call — no training data needed. https://www.nyckel.com/docs/api/operations/invoke-function/ 4. **List Samples** — `GET /v1/functions/{functionId}/samples` Pull the production samples that were captured. Filter by low confidence or disagreement to find the ones worth reviewing. https://www.nyckel.com/docs/api/operations/list-samples/ 5. **Update a Sample** — `PUT /v1/functions/{functionId}/samples/{sampleId}/annotation` Correct a sample's label. The next automatic retrain learns from it. Loop steps 3–5 to keep improving. https://www.nyckel.com/docs/api/operations/put-annotation/ ## When you need more - **Sample Sets** (`POST /v1/functions/{functionId}/samples/{sampleId}/sample-sets`) — Group samples into named sets. Useful for held-out evaluation data and structured cohorts. https://www.nyckel.com/docs/api/operations/post-sample-set-to-sample/ - **Get a Function** (`GET /v1/functions/{functionId}`) — Inspect the function's configuration and a live summary of sample counts, annotated counts, and per-label distribution. https://www.nyckel.com/docs/api/operations/get-function/ ## All operations ### Functions - `List` — GET `/v1/functions` — Returns every Function in your project. Use the startIndex / count parameters — https://www.nyckel.com/docs/api/operations/list/ - `PostFunction` — POST `/v1/functions` — Creates a new Function. Specify the input modality — https://www.nyckel.com/docs/api/operations/post-function/ - `GetFunction` — GET `/v1/functions/{functionId}` — Returns the Function's static configuration — the properties set at — https://www.nyckel.com/docs/api/operations/get-function/ - `PutFunction` — PUT `/v1/functions/{functionId}` — Updates the name or `projectId` of a Function. Input and output modality — https://www.nyckel.com/docs/api/operations/put-function/ - `DeleteFunction` — DELETE `/v1/functions/{functionId}` — Permanently deletes the Function and all its Labels, Samples, and Annotations — https://www.nyckel.com/docs/api/operations/delete-function/ - `GetFunctionSummary` — GET `/v1/functions/{functionId}/summary` — Returns aggregate counts for a Function — total samples, annotated (see https://www.nyckel.com/docs/api/operations/get-function/#get-function-summary) ### Labels - `ListLabels` — GET `/v1/functions/{functionId}/labels` — List labels — https://www.nyckel.com/docs/api/operations/list-labels/ - `PostLabel` — POST `/v1/functions/{functionId}/labels` — Create label — https://www.nyckel.com/docs/api/operations/post-label/ - `GetLabel` — GET `/v1/functions/{functionId}/labels/{labelId}` — Get label — https://www.nyckel.com/docs/api/operations/get-label/ - `PutLabel` — PUT `/v1/functions/{functionId}/labels/{labelId}` — Update label — https://www.nyckel.com/docs/api/operations/put-label/ - `DeleteLabel` — DELETE `/v1/functions/{functionId}/labels/{labelId}` — Delete label — https://www.nyckel.com/docs/api/operations/delete-label/ ### Samples - `ListSamples` — GET `/v1/functions/{functionId}/samples` — Lists Samples for a Function. Supports rich filtering: by annotation / — https://www.nyckel.com/docs/api/operations/list-samples/ - `PostSample` — POST `/v1/functions/{functionId}/samples` — Create sample — https://www.nyckel.com/docs/api/operations/post-sample/ - `DeleteSampleByExternalId` — DELETE `/v1/functions/{functionId}/samples` — Delete sample by external id (see https://www.nyckel.com/docs/api/operations/delete-sample/#delete-sample-by-external-id) - `GetSample` — GET `/v1/functions/{functionId}/samples/{sampleId}` — Get sample — https://www.nyckel.com/docs/api/operations/get-sample/ - `PutAnnotation` — PUT `/v1/functions/{functionId}/samples/{sampleId}/annotation` — Sets (or replaces) the Sample's annotation to the given Label. If the — https://www.nyckel.com/docs/api/operations/put-annotation/ - `DeleteSample` — DELETE `/v1/functions/{functionId}/samples/{sampleId}` — Delete sample — https://www.nyckel.com/docs/api/operations/delete-sample/ - `DeleteAnnotation` — DELETE `/v1/functions/{functionId}/samples/{sampleId}/annotation` — Removes the Sample's annotation. The Sample itself remains in the (see https://www.nyckel.com/docs/api/operations/put-annotation/#delete-annotation) - `PostSampleSetToSample` — POST `/v1/functions/{functionId}/samples/{sampleId}/sample-sets` — Adds the Sample to the named Sample Set. The Sample Set is created — https://www.nyckel.com/docs/api/operations/post-sample-set-to-sample/ - `DeleteSampleSetFromSample` — DELETE `/v1/functions/{functionId}/samples/{sampleId}/sample-sets/{sampleSetId}` — Removes the Sample from the named Sample Set. The Sample itself remains (see https://www.nyckel.com/docs/api/operations/post-sample-set-to-sample/#delete-sample-set-from-sample) ### Fields - `ListFields` — GET `/v1/functions/{functionId}/fields` — List fields — https://www.nyckel.com/docs/api/operations/list-fields/ - `PostField` — POST `/v1/functions/{functionId}/fields` — Create field — https://www.nyckel.com/docs/api/operations/post-field/ - `GetField` — GET `/v1/functions/{functionId}/fields/{fieldId}` — Get field — https://www.nyckel.com/docs/api/operations/get-field/ - `PutField` — PUT `/v1/functions/{functionId}/fields/{fieldId}` — Update field — https://www.nyckel.com/docs/api/operations/put-field/ - `DeleteField` — DELETE `/v1/functions/{functionId}/fields/{fieldId}` — Delete field — https://www.nyckel.com/docs/api/operations/delete-field/ ### Invoke - `InvokeFunction` — POST `/v1/functions/{functionId}/invoke` — Sends an input to a trained Function and returns a `FunctionOutput` — https://www.nyckel.com/docs/api/operations/invoke-function/ ### Search Functions - `Invoke` — POST `/v1/search-functions/{functionId}/invoke` — Search Functions return nearest-neighbor Samples instead of a Label — https://www.nyckel.com/docs/api/operations/invoke/ ## Schemas - `Annotation` (ontology: Annotation) — https://www.nyckel.com/docs/api/schemas/annotation/ - `CaptureReason` — https://www.nyckel.com/docs/api/schemas/capture-reason/ - `Error` — https://www.nyckel.com/docs/api/schemas/error/ - `Field` (ontology: Field) — https://www.nyckel.com/docs/api/schemas/field/ - `FieldType` — https://www.nyckel.com/docs/api/schemas/field-type/ - `Function` (ontology: Function) — https://www.nyckel.com/docs/api/schemas/function/ - `FunctionInputModality` — https://www.nyckel.com/docs/api/schemas/function-input-modality/ - `FunctionOutput` — https://www.nyckel.com/docs/api/schemas/function-output/ - `FunctionOutputModality` — https://www.nyckel.com/docs/api/schemas/function-output-modality/ - `FunctionSummary` — https://www.nyckel.com/docs/api/schemas/function-summary/ - `IFunctionInput` — https://www.nyckel.com/docs/api/schemas/i-function-input/ - `InvokeInput` — https://www.nyckel.com/docs/api/schemas/invoke-input/ - `Label` (ontology: Label) — https://www.nyckel.com/docs/api/schemas/label/ - `LabelConfidence` — https://www.nyckel.com/docs/api/schemas/label-confidence/ - `LabelCountDictionary` — https://www.nyckel.com/docs/api/schemas/label-count-dictionary/ - `Prediction` (ontology: Prediction) — https://www.nyckel.com/docs/api/schemas/prediction/ - `Sample` (ontology: Sample) — https://www.nyckel.com/docs/api/schemas/sample/ - `SampleOrigin` — https://www.nyckel.com/docs/api/schemas/sample-origin/ - `SampleSetRelationship` — https://www.nyckel.com/docs/api/schemas/sample-set-relationship/ - `SampleSortBy` — https://www.nyckel.com/docs/api/schemas/sample-sort-by/ - `SearchInvokeInput` — https://www.nyckel.com/docs/api/schemas/search-invoke-input/ - `SearchSample` — https://www.nyckel.com/docs/api/schemas/search-sample/ - `SortOrder` — https://www.nyckel.com/docs/api/schemas/sort-order/ - `WritableField` — https://www.nyckel.com/docs/api/schemas/writable-field/ - `WritableFunction` — https://www.nyckel.com/docs/api/schemas/writable-function/ - `WritableLabel` — https://www.nyckel.com/docs/api/schemas/writable-label/ - `WritableSample` — https://www.nyckel.com/docs/api/schemas/writable-sample/ ## When not to use Nyckel Nyckel is not primarily a text generation, chatbot, or LLM platform. It is built for structured predictions — classifications, detections, similarity rankings, and tabular outputs — where the answer space is bounded and the model can improve from labeled examples. If you need open-ended natural language generation, summarization, or conversational responses, a general LLM provider is a better fit. ## More - Homepage: https://www.nyckel.com/ - Documentation: https://www.nyckel.com/docs/ - API reference: https://www.nyckel.com/docs/api/ - OpenAPI spec: https://www.nyckel.com/openapi/v1.json - Full LLM doc: https://www.nyckel.com/llms-full.txt - Pretrained classifiers: https://www.nyckel.com/pretrained-classifiers/ - Pretrained detectors: https://www.nyckel.com/pretrained-detectors/