Field Mapping Validator
integration.field_mapping_validate
Overview
You send sourceFields and targetFields with name, type and optional required, plus mappings with source, target and transform NONE, STRINGIFY, PARSE_INTEGER, PARSE_NUMBER, PARSE_BOOLEAN, ISO_DATE or ISO_DATETIME. allowManyToOne defaults to false. Names compare as exact Unicode. This does not apply mappings or evaluate expressions.
A silently lossy mapping corrupts a sync before the first write.
Reliability
Deterministic type lattice; names compare as exact Unicode. MAPPING_INVALID — trigger: duplicate names or an unknown transform; retryable: no; next: send unique names and the published enum. MAPPING_LIMIT_EXCEEDED — trigger: more than 2,000 fields or mappings; retryable: no; next: split the schema.
Context footprint
Verdict and field names only. A successful call costs 1 execution credit.
When to use it
When two declared field lists must be wired with a published transform.
When you need to apply the mapping or evaluate an expression language.
Scope
Non-goals
- Does not apply mappings
- Does not evaluate expressions
- Does not resolve nested object schemas
Properties
Capabilities
Cost & billing
Flat rate per invocation
File handling
How we handle your data
What this means
This skill may receive sensitive content, but it does not target sensitive data and returns only a structured non-sensitive result.
Squillify guarantees
- Runs inside Squillify
- This skill runs inside Squillify.
- Payloads are not sent to an external service by this skill.
- Squillify does not permanently store submitted payloads.
- Telemetry records metadata only, not submitted content.
- Submitted payloads are not used for training.
- Submitted payloads are not reviewed by humans.
- This skill does not target sensitive data.
- The response does not contain submitted content.
Your responsibility
Squillify does not determine whether submitted content is sensitive. Your application is responsible for deciding what data it is allowed to submit. Your application is responsible for securing the response.
Input schema
| Field | Type | Required | Description |
|---|---|---|---|
| sourceFields | array | Yes | Bounded array of 1 through 10001 source fields; runtime accepts at most 2000. |
| targetFields | array | Yes | Bounded array of 1 through 10001 target fields; runtime accepts at most 2000. |
| mappings | array | Yes | Bounded array of 0 through 10001 mappings; runtime accepts at most 2000. |
| allowManyToOne | boolean | No | Whether two sources may share a target. Omit it for false. |
Output schema
| Field | Type | Required | Description |
|---|---|---|---|
| valid | boolean | Yes | True when no ERROR diagnostic was raised. |
| allowManyToOne | boolean | Yes | Applied many-to-one setting. |
| mappedCount | integer | Yes | How many distinct targets were mapped. |
| unmappedRequiredTargets | array | Yes | Bounded array of 0 through 2000 required target names that have no mapping. |
| unusedSources | array | Yes | Bounded array of 0 through 2000 declared source names that were not mapped. |
| diagnostics | array | Yes | Bounded array of 0 through 500 closed findings, each with code, severity, message, path, source and details. |
API contract
POST /v1/executecurl -sS -X POST "$BASE/v1/execute" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"skillKey":"integration.field_mapping_validate","input":{"sourceFields":[{"name":"id","type":"STRING"}],"targetFields":[{"name":"id","type":"STRING"}],"mappings":[{"source":"id","target":"id"}]}}'import { Squillify } from "@squillify/sdk";
const sq = new Squillify({ apiKey: process.env.SQUILLIFY_API_KEY });
const { output } = await sq.execute("integration.field_mapping_validate", {"mappings":[{"source":"id","target":"identifier","transform":"NONE"}],"targetFields":[{"name":"identifier","required":true,"type":"STRING"}],"sourceFields":[{"type":"STRING","name":"id"}]});Errors
| Code | HTTP | Retryable | Description |
|---|---|---|---|
| VALIDATION_ERROR | 400 | No | The request payload failed schema validation. |
| UNAUTHORIZED | 401 | No | Missing or invalid API key. |
| SKILL_NOT_ACCESSIBLE | 403 | No | The API key is not granted access to this skill. |
| SKILL_NOT_AVAILABLE_FOR_PLAN | 403 | No | This skill is not included in your current plan. |
| PLAN_ELIGIBILITY_UNAVAILABLE | 503 | Yes | Plan eligibility could not be decided. Retry after backoff. |
| SKILL_NOT_FOUND | 404 | No | The requested skill or version does not exist. |
| TENANT_RATE_LIMITED | 429 | Yes | Request rate limit exceeded. Retry after backoff. |
| QUOTA_EXCEEDED | 429 | Yes | Plan quota exhausted. Retryable once the quota period resets. |
| EXECUTION_TIMEOUT | 504 | Yes | Execution exceeded the allowed time budget. |
| MAPPING_INVALID | 400 | No | The request payload failed this skill's input validation. |
| MAPPING_LIMIT_EXCEEDED | 429 | No | A size, quota, rate, or time limit was exceeded. |
Other limits
| Limit | Value |
|---|---|
| Recommended inline bytes | 32 KiB |
Limitations
- Does not apply mappings
- Does not evaluate expressions
- Does not resolve nested object schemas
- Running the mapping
- Arbitrary transform languages
How to call
POST /v1/execute (requires authentication)
{
"skillKey": "integration.field_mapping_validate",
"input": {
"mappings": [
{
"source": "id",
"target": "identifier",
"transform": "NONE"
}
],
"targetFields": [
{
"name": "identifier",
"required": true,
"type": "STRING"
}
],
"sourceFields": [
{
"type": "STRING",
"name": "id"
}
]
}
}Examples
STRING to STRING with NONE is valid
{
"mappings": [
{
"source": "id",
"target": "identifier",
"transform": "NONE"
}
],
"targetFields": [
{
"name": "identifier",
"required": true,
"type": "STRING"
}
],
"sourceFields": [
{
"type": "STRING",
"name": "id"
}
]
}{
"allowManyToOne": false,
"valid": true,
"mappedCount": 1,
"unusedSources": [],
"unmappedRequiredTargets": [],
"diagnostics": []
}NUMBER to INTEGER under NONE is invalid
{
"mappings": [
{
"source": "amount",
"target": "count",
"transform": "NONE"
}
],
"targetFields": [
{
"name": "count",
"required": true,
"type": "INTEGER"
}
],
"sourceFields": [
{
"type": "NUMBER",
"name": "amount"
}
]
}{
"allowManyToOne": false,
"valid": false,
"mappedCount": 1,
"unusedSources": [],
"unmappedRequiredTargets": [],
"diagnostics": [
{
"code": "LOSSY_MAPPING",
"severity": "ERROR",
"message": "The declared transform cannot take this source type to this target type.",
"path": "/mappings/0/transform",
"source": "squillify",
"details": {}
}
]
}Recommended use cases
- Reject NUMBER to INTEGER under NONE
- Require every required target to be mapped
Avoid for
- Running the mapping
- Arbitrary transform languages
Related skills
Composable with
Safety & privacy
- Runs without calling any external service.
- Your payloads are never stored permanently.
- Telemetry captures metadata only — never your payload contents.
- We never train models on your payloads.
- No human reviews your payloads.