{"schemaVersion":"mappls.contract-generations.v1","boundary":"Preferred means the highest version-labelled generation retained in this source snapshot. It does not establish current provider support, compatibility, entitlement, regional availability, or a safe production migration.","group":{"slug":"intouch-post-geofence-9930a2a5a4","family":"intouch","familyName":"InTouch Telematics","product":"InTouch","stateModel":"stateful","method":"POST","path":"/geofence/","title":"POST /geofence/","preferredGeneration":"v2-0-0","preferredSlug":"intouch-post-geofence-create-a-new-geofence","variants":[{"generation":"v1-0-0","apiVersion":"1.0.0","slug":"intouch-post-geofence-create-a-new-geofence-v1-0-0","href":"/api-reference/intouch-post-geofence-create-a-new-geofence-v1-0-0","summary":"Create A New Geofence","sourceFile":"contenthub/dochub/mapmyindia-intouch-rest-apis/custom/Intouch-Telematics-Swagger-25052020.json","sourceFingerprint":"54637441ab0c8ea447e121ba33afbc464e714a3dbceec49d4b70dabe9778657f","baseUrl":"https://intouch.mapmyindia.com/iot/api","authMode":"bearer","parameterKeys":[],"requiredParameterKeys":[],"requestFields":["buffer","geometry","name"],"requiredRequestFields":[],"responseStatuses":["201","203","400","401","404"],"responseFields":["400:error","400:message","400:status"],"isPreferredGeneration":false},{"generation":"v2-0-0","apiVersion":"2.0.0","slug":"intouch-post-geofence-create-a-new-geofence","href":"/api-reference/intouch-post-geofence-create-a-new-geofence","summary":"Create A New Geofence","sourceFile":"contenthub/dochub/mapmyindia-intouch-rest-apis/custom/geofence.yaml","sourceFingerprint":"03d663d784a8ea9af1a3915cad4395ab716b167774dbf54a73c516bd10bc887a","baseUrl":"https://intouch.mapmyindia.com/iot/api","authMode":"bearer","parameterKeys":[],"requiredParameterKeys":[],"requestFields":["buffer","geometry","name"],"requiredRequestFields":[],"responseStatuses":["201","203","400","401","404"],"responseFields":["400:error","400:message","400:status"],"isPreferredGeneration":true}],"transitions":[{"fromGeneration":"v1-0-0","fromSlug":"intouch-post-geofence-create-a-new-geofence-v1-0-0","toGeneration":"v2-0-0","toSlug":"intouch-post-geofence-create-a-new-geofence","addedParameters":[],"removedParameters":[],"newlyRequiredParameters":[],"addedRequestFields":[],"removedRequestFields":[],"newlyRequiredRequestFields":[],"addedResponseStatuses":[],"removedResponseStatuses":[],"addedResponseFields":[],"removedResponseFields":[],"authChanged":false,"baseUrlChanged":false,"breakingSignals":[],"migrationChecklist":["Confirm the Mappls account is entitled to v2-0-0; source ordering is not availability proof.","Run both retained contract generations against sanitized fixtures and compare application parsing.","Update only declared parameters and request fields; do not infer undocumented aliases.","Exercise authentication rejection, validation, rate-limit, timeout, and unknown-outcome handling.","For state-changing operations, migrate behind an idempotent adapter and reconcile before retry.","Retain the source fingerprints, acceptance evidence, rollback trigger, and previous adapter until approval."]}],"evidenceBoundary":"Preferred means the highest version-labelled generation retained in this source snapshot. It does not establish current provider support, compatibility, entitlement, regional availability, or a safe production migration."},"migrationKit":{"schemaVersion":"mappls.contract-generation-migration-kit.v1","slug":"intouch-post-geofence-9930a2a5a4-migration-kit","groupSlug":"intouch-post-geofence-9930a2a5a4","title":"POST /geofence/: v1-0-0 → v2-0-0","fromGeneration":"v1-0-0","toGeneration":"v2-0-0","downloadPath":"/downloads/api-generations/intouch-post-geofence-9930a2a5a4-migration-kit.zip","checksumPath":"/downloads/api-generations/intouch-post-geofence-9930a2a5a4-migration-kit.zip.sha256","adapterLanguages":["JavaScript","Python","Java","C#","Go","PHP","Ruby","Kotlin"],"verifiedTests":3,"providerCalls":0,"credentialsAccepted":false,"files":[{"path":"README.md","language":"markdown","purpose":"Migration workshop and runbook"},{"path":"MIGRATION_MANIFEST.json","language":"json","purpose":"Exact machine-readable source and diff identity"},{"path":"ACCEPTANCE.md","language":"markdown","purpose":"Success and hostile-path evidence"},{"path":"ROLLBACK.md","language":"markdown","purpose":"Generation-safe cutover and rollback plan"},{"path":"fixtures/source-envelope.json","language":"json","purpose":"Sanitized source-generation shape"},{"path":"fixtures/target-envelope.json","language":"json","purpose":"Sanitized target-generation shape"},{"path":"src/runtime/adapter.mjs","language":"javascript","purpose":"Executable allow-list adapter"},{"path":"src/runtime/inspect.mjs","language":"javascript","purpose":"Offline fixture inspector"},{"path":"src/adapters/adapter.mjs","language":"javascript","purpose":"JavaScript application-owned adapter scaffold"},{"path":"src/adapters/adapter.py","language":"python","purpose":"Python application-owned adapter scaffold"},{"path":"src/adapters/MapplsGenerationAdapter.java","language":"java","purpose":"Java application-owned adapter scaffold"},{"path":"src/adapters/MapplsGenerationAdapter.cs","language":"csharp","purpose":"C# application-owned adapter scaffold"},{"path":"src/adapters/adapter.go","language":"go","purpose":"Go application-owned adapter scaffold"},{"path":"src/adapters/adapter.php","language":"php","purpose":"PHP application-owned adapter scaffold"},{"path":"src/adapters/adapter.rb","language":"ruby","purpose":"Ruby application-owned adapter scaffold"},{"path":"src/adapters/MapplsGenerationAdapter.kt","language":"kotlin","purpose":"Kotlin application-owned adapter scaffold"},{"path":"test/adapter.test.mjs","language":"javascript","purpose":"Three offline migration invariants"},{"path":"package.json","language":"json","purpose":"Dependency-free execution commands"}],"samples":[{"language":"javascript","label":"JavaScript","code":"// Structural projection only: add semantic mappings after entitled validation.\nconst targetParameters=new Set([]);\nconst targetBody=new Set([\"buffer\",\"geometry\",\"name\"]);\nconst requiredParameters=[];\nconst requiredBody=[];\n\nconst project=(source,allowed)=>Object.fromEntries(Object.entries(source??{}).filter(([key])=>allowed.has(key)));\nexport function adapt(source={}){\n  const parameters=project(source.parameters,targetParameters);\n  const body=project(source.body,targetBody);\n  const missing=[...requiredParameters.filter(key=>parameters[key]==null),...requiredBody.filter(key=>body[key]==null)];\n  return {target:{parameters,body},missing,dropped:{parameters:Object.keys(source.parameters??{}).filter(key=>!targetParameters.has(key)),body:Object.keys(source.body??{}).filter(key=>!targetBody.has(key))}};\n}"},{"language":"python","label":"Python","code":"# Structural projection only: add semantic mappings after entitled validation.\nTARGET_PARAMETERS=set([])\nTARGET_BODY=set([\"buffer\",\"geometry\",\"name\"])\nREQUIRED_PARAMETERS=[]\nREQUIRED_BODY=[]\n\ndef adapt(source):\n    source_parameters=source.get(\"parameters\", {})\n    source_body=source.get(\"body\", {})\n    parameters={key:value for key,value in source_parameters.items() if key in TARGET_PARAMETERS}\n    body={key:value for key,value in source_body.items() if key in TARGET_BODY}\n    missing=[key for key in REQUIRED_PARAMETERS if parameters.get(key) is None]\n    missing += [key for key in REQUIRED_BODY if body.get(key) is None]\n    return {\"target\":{\"parameters\":parameters,\"body\":body},\"missing\":missing,\"dropped\":{\"parameters\":[key for key in source_parameters if key not in TARGET_PARAMETERS],\"body\":[key for key in source_body if key not in TARGET_BODY]}}"},{"language":"java","label":"Java","code":"import java.util.*;\n\npublic final class MapplsGenerationAdapter {\n  private static final Set<String> TARGET_PARAMETERS=Set.of();\n  private static final Set<String> TARGET_BODY=Set.of(\"buffer\", \"geometry\", \"name\");\n  private static final List<String> REQUIRED_PARAMETERS=List.of();\n  private static final List<String> REQUIRED_BODY=List.of();\n  public record Envelope(Map<String,Object> parameters,Map<String,Object> body){}\n  public record Result(Envelope target,List<String> missing,List<String> droppedParameters,List<String> droppedBody){}\n  // Structural projection only: add semantic mappings after entitled validation.\n  private static Map<String,Object> project(Map<String,Object> source,Set<String> allowed){\n    var out=new LinkedHashMap<String,Object>();\n    source.forEach((key,value)->{if(allowed.contains(key))out.put(key,value);});\n    return out;\n  }\n  public static Result adapt(Envelope source){\n    var parameters=project(source.parameters(),TARGET_PARAMETERS);\n    var body=project(source.body(),TARGET_BODY);\n    var missing=new ArrayList<String>();\n    REQUIRED_PARAMETERS.stream().filter(key->parameters.get(key)==null).forEach(missing::add);\n    REQUIRED_BODY.stream().filter(key->body.get(key)==null).forEach(missing::add);\n    return new Result(new Envelope(parameters,body),missing,\n      source.parameters().keySet().stream().filter(key->!TARGET_PARAMETERS.contains(key)).toList(),\n      source.body().keySet().stream().filter(key->!TARGET_BODY.contains(key)).toList());\n  }\n}"},{"language":"csharp","label":"C#","code":"using System.Collections.Generic;\nusing System.Linq;\n\npublic static class MapplsGenerationAdapter {\n  static readonly HashSet<string> TargetParameters=new([]);\n  static readonly HashSet<string> TargetBody=new([\"buffer\", \"geometry\", \"name\"]);\n  static readonly string[] RequiredParameters=[];\n  static readonly string[] RequiredBody=[];\n  public sealed record Envelope(Dictionary<string,object?> Parameters,Dictionary<string,object?> Body);\n  public sealed record Result(Envelope Target,string[] Missing,string[] DroppedParameters,string[] DroppedBody);\n  // Structural projection only: add semantic mappings after entitled validation.\n  static Dictionary<string,object?> Project(Dictionary<string,object?> source,HashSet<string> allowed)\n    =>source.Where(pair=>allowed.Contains(pair.Key)).ToDictionary();\n  public static Result Adapt(Envelope source){\n    var parameters=Project(source.Parameters,TargetParameters);\n    var body=Project(source.Body,TargetBody);\n    var missing=RequiredParameters.Where(key=>!parameters.TryGetValue(key,out var value)||value is null)\n      .Concat(RequiredBody.Where(key=>!body.TryGetValue(key,out var value)||value is null)).ToArray();\n    return new(new(parameters,body),missing,\n      source.Parameters.Keys.Where(key=>!TargetParameters.Contains(key)).ToArray(),\n      source.Body.Keys.Where(key=>!TargetBody.Contains(key)).ToArray());\n  }\n}"},{"language":"go","label":"Go","code":"package migration\n\n// Structural projection only: add semantic mappings after entitled validation.\nvar targetParameters=map[string]bool{}\nvar targetBody=map[string]bool{\"buffer\":true,\"geometry\":true,\"name\":true}\nvar requiredParameters=[]string{}\nvar requiredBody=[]string{}\ntype Envelope struct { Parameters map[string]any; Body map[string]any }\ntype Result struct { Target Envelope; Missing,DroppedParameters,DroppedBody []string }\nfunc project(source map[string]any,allowed map[string]bool)(map[string]any,[]string){\n  out:=map[string]any{};dropped:=[]string{}\n  for key,value:=range source { if allowed[key] { out[key]=value } else { dropped=append(dropped,key) } }\n  return out,dropped\n}\nfunc Adapt(source Envelope)Result{\n  parameters,droppedParameters:=project(source.Parameters,targetParameters)\n  body,droppedBody:=project(source.Body,targetBody)\n  missing:=[]string{}\n  for _,key:=range requiredParameters { if parameters[key]==nil { missing=append(missing,key) } }\n  for _,key:=range requiredBody { if body[key]==nil { missing=append(missing,key) } }\n  return Result{Envelope{parameters,body},missing,droppedParameters,droppedBody}\n}"},{"language":"php","label":"PHP","code":"<?php\nconst TARGET_PARAMETERS=[];\nconst TARGET_BODY=[\"buffer\",\"geometry\",\"name\"];\nconst REQUIRED_PARAMETERS=[];\nconst REQUIRED_BODY=[];\n// Structural projection only: add semantic mappings after entitled validation.\nfunction project(array $source,array $allowed):array{\n  return array_intersect_key($source,array_flip($allowed));\n}\nfunction adapt(array $source):array{\n  $sourceParameters=$source['parameters']??[];$sourceBody=$source['body']??[];\n  $parameters=project($sourceParameters,TARGET_PARAMETERS);$body=project($sourceBody,TARGET_BODY);\n  $missing=array_values(array_merge(\n    array_filter(REQUIRED_PARAMETERS,fn($key)=>!array_key_exists($key,$parameters)||$parameters[$key]===null),\n    array_filter(REQUIRED_BODY,fn($key)=>!array_key_exists($key,$body)||$body[$key]===null)\n  ));\n  return ['target'=>['parameters'=>$parameters,'body'=>$body],'missing'=>$missing,\n    'dropped'=>['parameters'=>array_values(array_diff(array_keys($sourceParameters),TARGET_PARAMETERS)),\n      'body'=>array_values(array_diff(array_keys($sourceBody),TARGET_BODY))]];\n}"},{"language":"ruby","label":"Ruby","code":"# Structural projection only: add semantic mappings after entitled validation.\nmodule MapplsGenerationAdapter\n  TARGET_PARAMETERS=[].freeze\n  TARGET_BODY=[\"buffer\",\"geometry\",\"name\"].freeze\n  REQUIRED_PARAMETERS=[].freeze\n  REQUIRED_BODY=[].freeze\n  def self.project(source,allowed)\n    source.select{|key,_| allowed.include?(key)}\n  end\n  def self.adapt(source)\n    source_parameters=source.fetch(\"parameters\",{});source_body=source.fetch(\"body\",{})\n    parameters=project(source_parameters,TARGET_PARAMETERS);body=project(source_body,TARGET_BODY)\n    missing=REQUIRED_PARAMETERS.reject{|key| parameters.key?(key)&&!parameters[key].nil?}+REQUIRED_BODY.reject{|key| body.key?(key)&&!body[key].nil?}\n    {\"target\"=>{\"parameters\"=>parameters,\"body\"=>body},\"missing\"=>missing,\"dropped\"=>{\"parameters\"=>source_parameters.keys-TARGET_PARAMETERS,\"body\"=>source_body.keys-TARGET_BODY}}\n  end\nend"},{"language":"kotlin","label":"Kotlin","code":"data class Envelope(val parameters:Map<String,Any?>,val body:Map<String,Any?>)\ndata class MigrationResult(val target:Envelope,val missing:List<String>,val droppedParameters:List<String>,val droppedBody:List<String>)\nobject MapplsGenerationAdapter{\n  private val targetParameters=setOf()\n  private val targetBody=setOf(\"buffer\", \"geometry\", \"name\")\n  private val requiredParameters=listOf()\n  private val requiredBody=listOf()\n  // Structural projection only: add semantic mappings after entitled validation.\n  fun adapt(source:Envelope):MigrationResult{\n    val parameters=source.parameters.filterKeys(targetParameters::contains)\n    val body=source.body.filterKeys(targetBody::contains)\n    val missing=requiredParameters.filter{parameters[it]==null}+requiredBody.filter{body[it]==null}\n    return MigrationResult(Envelope(parameters,body),missing,\n      source.parameters.keys.filterNot(targetParameters::contains),\n      source.body.keys.filterNot(targetBody::contains))\n  }\n}"}]}}