[{"data":1,"prerenderedAt":1474},["ShallowReactive",2],{"guide-csv-to-json-api-integration":3},{"id":4,"title":5,"body":6,"date":1466,"description":1467,"extension":1468,"meta":1469,"navigation":454,"path":1470,"readingTime":128,"seo":1471,"stem":1472,"__hash__":1473},"guides\u002Fguides\u002Fcsv-to-json-api-integration.md","CSV to JSON for API Integration",{"type":7,"value":8,"toc":1455},"minimark",[9,14,18,21,34,38,41,77,80,237,240,269,273,276,367,378,385,592,596,599,614,617,719,722,764,767,980,984,987,1024,1295,1299,1302,1328,1331,1335,1417,1421,1438,1442,1451],[10,11,13],"h2",{"id":12},"why-apis-expect-json-not-csv","Why APIs Expect JSON, Not CSV",[15,16,17],"p",{},"REST APIs almost universally accept JSON request bodies. CSV is a spreadsheet format — flat, row-based, and typeless. JSON supports nested objects, arrays, and explicit types. When you need to feed spreadsheet data into an API, you must convert CSV to JSON first.",[15,19,20],{},"Common scenarios:",[22,23,24,28,31],"ul",{},[25,26,27],"li",{},"Importing a product catalog from a spreadsheet into an e-commerce API",[25,29,30],{},"Bulk-uploading user records from a CRM export",[25,32,33],{},"Seeding a database through a REST endpoint",[10,35,37],{"id":36},"basic-csv-to-json-conversion","Basic CSV to JSON Conversion",[15,39,40],{},"Given this CSV:",[42,43,48],"pre",{"className":44,"code":45,"language":46,"meta":47,"style":47},"language-csv shiki shiki-themes github-light github-dark","name,email,role\nAlice,alice@example.com,admin\nBob,bob@example.com,user\nCarol,carol@example.com,user\n","csv","",[49,50,51,59,65,71],"code",{"__ignoreMap":47},[52,53,56],"span",{"class":54,"line":55},"line",1,[52,57,58],{},"name,email,role\n",[52,60,62],{"class":54,"line":61},2,[52,63,64],{},"Alice,alice@example.com,admin\n",[52,66,68],{"class":54,"line":67},3,[52,69,70],{},"Bob,bob@example.com,user\n",[52,72,74],{"class":54,"line":73},4,[52,75,76],{},"Carol,carol@example.com,user\n",[15,78,79],{},"The JSON output for API consumption:",[42,81,85],{"className":82,"code":83,"language":84,"meta":47,"style":47},"language-json shiki shiki-themes github-light github-dark","[\n  {\n    \"name\": \"Alice\",\n    \"email\": \"alice@example.com\",\n    \"role\": \"admin\"\n  },\n  {\n    \"name\": \"Bob\",\n    \"email\": \"bob@example.com\",\n    \"role\": \"user\"\n  },\n  {\n    \"name\": \"Carol\",\n    \"email\": \"carol@example.com\",\n    \"role\": \"user\"\n  }\n]\n","json",[49,86,87,93,98,114,126,137,143,148,160,172,182,187,192,204,216,225,231],{"__ignoreMap":47},[52,88,89],{"class":54,"line":55},[52,90,92],{"class":91},"sVt8B","[\n",[52,94,95],{"class":54,"line":61},[52,96,97],{"class":91},"  {\n",[52,99,100,104,107,111],{"class":54,"line":67},[52,101,103],{"class":102},"sj4cs","    \"name\"",[52,105,106],{"class":91},": ",[52,108,110],{"class":109},"sZZnC","\"Alice\"",[52,112,113],{"class":91},",\n",[52,115,116,119,121,124],{"class":54,"line":73},[52,117,118],{"class":102},"    \"email\"",[52,120,106],{"class":91},[52,122,123],{"class":109},"\"alice@example.com\"",[52,125,113],{"class":91},[52,127,129,132,134],{"class":54,"line":128},5,[52,130,131],{"class":102},"    \"role\"",[52,133,106],{"class":91},[52,135,136],{"class":109},"\"admin\"\n",[52,138,140],{"class":54,"line":139},6,[52,141,142],{"class":91},"  },\n",[52,144,146],{"class":54,"line":145},7,[52,147,97],{"class":91},[52,149,151,153,155,158],{"class":54,"line":150},8,[52,152,103],{"class":102},[52,154,106],{"class":91},[52,156,157],{"class":109},"\"Bob\"",[52,159,113],{"class":91},[52,161,163,165,167,170],{"class":54,"line":162},9,[52,164,118],{"class":102},[52,166,106],{"class":91},[52,168,169],{"class":109},"\"bob@example.com\"",[52,171,113],{"class":91},[52,173,175,177,179],{"class":54,"line":174},10,[52,176,131],{"class":102},[52,178,106],{"class":91},[52,180,181],{"class":109},"\"user\"\n",[52,183,185],{"class":54,"line":184},11,[52,186,142],{"class":91},[52,188,190],{"class":54,"line":189},12,[52,191,97],{"class":91},[52,193,195,197,199,202],{"class":54,"line":194},13,[52,196,103],{"class":102},[52,198,106],{"class":91},[52,200,201],{"class":109},"\"Carol\"",[52,203,113],{"class":91},[52,205,207,209,211,214],{"class":54,"line":206},14,[52,208,118],{"class":102},[52,210,106],{"class":91},[52,212,213],{"class":109},"\"carol@example.com\"",[52,215,113],{"class":91},[52,217,219,221,223],{"class":54,"line":218},15,[52,220,131],{"class":102},[52,222,106],{"class":91},[52,224,181],{"class":109},[52,226,228],{"class":54,"line":227},16,[52,229,230],{"class":91},"  }\n",[52,232,234],{"class":54,"line":233},17,[52,235,236],{"class":91},"]\n",[15,238,239],{},"Most APIs accept this array-of-objects format directly or wrapped in an envelope:",[42,241,243],{"className":82,"code":242,"language":84,"meta":47,"style":47},"{\n  \"users\": [...]\n}\n",[49,244,245,250,264],{"__ignoreMap":47},[52,246,247],{"class":54,"line":55},[52,248,249],{"class":91},"{\n",[52,251,252,255,258,262],{"class":54,"line":61},[52,253,254],{"class":102},"  \"users\"",[52,256,257],{"class":91},": [",[52,259,261],{"class":260},"s7hpK","...",[52,263,236],{"class":91},[52,265,266],{"class":54,"line":67},[52,267,268],{"class":91},"}\n",[10,270,272],{"id":271},"type-coercion-the-silent-bug-source","Type Coercion: The Silent Bug Source",[15,274,275],{},"CSV has no types — everything is a string. APIs often require specific types:",[277,278,279,295],"table",{},[280,281,282],"thead",{},[283,284,285,289,292],"tr",{},[286,287,288],"th",{},"CSV Value",[286,290,291],{},"Needed Type",[286,293,294],{},"Conversion",[296,297,298,318,335,350],"tbody",{},[283,299,300,306,309],{},[301,302,303],"td",{},[49,304,305],{},"25",[301,307,308],{},"number",[301,310,311,313,314,317],{},[49,312,305],{}," (not ",[49,315,316],{},"\"25\"",")",[283,319,320,325,328],{},[301,321,322],{},[49,323,324],{},"true",[301,326,327],{},"boolean",[301,329,330,313,332,317],{},[49,331,324],{},[49,333,334],{},"\"true\"",[283,336,337,342,345],{},[301,338,339],{},[49,340,341],{},"2024-01-15",[301,343,344],{},"date string",[301,346,347],{},[49,348,349],{},"\"2024-01-15\"",[283,351,352,357,360],{},[301,353,354],{},[49,355,356],{},"(empty)",[301,358,359],{},"null",[301,361,362,313,364,317],{},[49,363,359],{},[49,365,366],{},"\"\"",[15,368,369,370,373,374,377],{},"Without type coercion, you send ",[49,371,372],{},"\"age\": \"25\""," instead of ",[49,375,376],{},"\"age\": 25",". Some APIs reject the wrong type silently — the request succeeds but the field is ignored.",[15,379,380,384],{},[381,382,383],"strong",{},"Strategy",": Define a schema for your conversion:",[42,386,390],{"className":387,"code":388,"language":389,"meta":47,"style":47},"language-javascript shiki shiki-themes github-light github-dark","const schema = {\n  age: 'number',\n  active: 'boolean',\n  created_at: 'date',\n  notes: 'string'\n};\n\nfunction coerce(value, type) {\n  if (value === '') return null;\n  switch (type) {\n    case 'number': return Number(value);\n    case 'boolean': return value === 'true';\n    case 'date': return value; \u002F\u002F ISO format assumed\n    default: return value;\n  }\n}\n","javascript",[49,391,392,407,417,427,437,445,450,456,481,507,515,533,554,572,584,588],{"__ignoreMap":47},[52,393,394,398,401,404],{"class":54,"line":55},[52,395,397],{"class":396},"szBVR","const",[52,399,400],{"class":102}," schema",[52,402,403],{"class":396}," =",[52,405,406],{"class":91}," {\n",[52,408,409,412,415],{"class":54,"line":61},[52,410,411],{"class":91},"  age: ",[52,413,414],{"class":109},"'number'",[52,416,113],{"class":91},[52,418,419,422,425],{"class":54,"line":67},[52,420,421],{"class":91},"  active: ",[52,423,424],{"class":109},"'boolean'",[52,426,113],{"class":91},[52,428,429,432,435],{"class":54,"line":73},[52,430,431],{"class":91},"  created_at: ",[52,433,434],{"class":109},"'date'",[52,436,113],{"class":91},[52,438,439,442],{"class":54,"line":128},[52,440,441],{"class":91},"  notes: ",[52,443,444],{"class":109},"'string'\n",[52,446,447],{"class":54,"line":139},[52,448,449],{"class":91},"};\n",[52,451,452],{"class":54,"line":145},[52,453,455],{"emptyLinePlaceholder":454},true,"\n",[52,457,458,461,465,468,472,475,478],{"class":54,"line":150},[52,459,460],{"class":396},"function",[52,462,464],{"class":463},"sScJk"," coerce",[52,466,467],{"class":91},"(",[52,469,471],{"class":470},"s4XuR","value",[52,473,474],{"class":91},", ",[52,476,477],{"class":470},"type",[52,479,480],{"class":91},") {\n",[52,482,483,486,489,492,495,498,501,504],{"class":54,"line":162},[52,484,485],{"class":396},"  if",[52,487,488],{"class":91}," (value ",[52,490,491],{"class":396},"===",[52,493,494],{"class":109}," ''",[52,496,497],{"class":91},") ",[52,499,500],{"class":396},"return",[52,502,503],{"class":102}," null",[52,505,506],{"class":91},";\n",[52,508,509,512],{"class":54,"line":174},[52,510,511],{"class":396},"  switch",[52,513,514],{"class":91}," (type) {\n",[52,516,517,520,523,525,527,530],{"class":54,"line":184},[52,518,519],{"class":396},"    case",[52,521,522],{"class":109}," 'number'",[52,524,106],{"class":91},[52,526,500],{"class":396},[52,528,529],{"class":463}," Number",[52,531,532],{"class":91},"(value);\n",[52,534,535,537,540,542,544,547,549,552],{"class":54,"line":189},[52,536,519],{"class":396},[52,538,539],{"class":109}," 'boolean'",[52,541,106],{"class":91},[52,543,500],{"class":396},[52,545,546],{"class":91}," value ",[52,548,491],{"class":396},[52,550,551],{"class":109}," 'true'",[52,553,506],{"class":91},[52,555,556,558,561,563,565,568],{"class":54,"line":194},[52,557,519],{"class":396},[52,559,560],{"class":109}," 'date'",[52,562,106],{"class":91},[52,564,500],{"class":396},[52,566,567],{"class":91}," value; ",[52,569,571],{"class":570},"sJ8bj","\u002F\u002F ISO format assumed\n",[52,573,574,577,579,581],{"class":54,"line":206},[52,575,576],{"class":396},"    default",[52,578,106],{"class":91},[52,580,500],{"class":396},[52,582,583],{"class":91}," value;\n",[52,585,586],{"class":54,"line":218},[52,587,230],{"class":91},[52,589,590],{"class":54,"line":227},[52,591,268],{"class":91},[10,593,595],{"id":594},"nested-object-construction","Nested Object Construction",[15,597,598],{},"APIs often expect nested structures. A flat CSV row:",[42,600,602],{"className":44,"code":601,"language":46,"meta":47,"style":47},"name,street,city,zip,role_name,role_level\nAlice,123 Main St,Portland,97201,admin,5\n",[49,603,604,609],{"__ignoreMap":47},[52,605,606],{"class":54,"line":55},[52,607,608],{},"name,street,city,zip,role_name,role_level\n",[52,610,611],{"class":54,"line":61},[52,612,613],{},"Alice,123 Main St,Portland,97201,admin,5\n",[15,615,616],{},"Needs to become:",[42,618,620],{"className":82,"code":619,"language":84,"meta":47,"style":47},"{\n  \"name\": \"Alice\",\n  \"address\": {\n    \"street\": \"123 Main St\",\n    \"city\": \"Portland\",\n    \"zip\": \"97201\"\n  },\n  \"role\": {\n    \"name\": \"admin\",\n    \"level\": 5\n  }\n}\n",[49,621,622,626,637,645,657,669,679,683,690,701,711,715],{"__ignoreMap":47},[52,623,624],{"class":54,"line":55},[52,625,249],{"class":91},[52,627,628,631,633,635],{"class":54,"line":61},[52,629,630],{"class":102},"  \"name\"",[52,632,106],{"class":91},[52,634,110],{"class":109},[52,636,113],{"class":91},[52,638,639,642],{"class":54,"line":67},[52,640,641],{"class":102},"  \"address\"",[52,643,644],{"class":91},": {\n",[52,646,647,650,652,655],{"class":54,"line":73},[52,648,649],{"class":102},"    \"street\"",[52,651,106],{"class":91},[52,653,654],{"class":109},"\"123 Main St\"",[52,656,113],{"class":91},[52,658,659,662,664,667],{"class":54,"line":128},[52,660,661],{"class":102},"    \"city\"",[52,663,106],{"class":91},[52,665,666],{"class":109},"\"Portland\"",[52,668,113],{"class":91},[52,670,671,674,676],{"class":54,"line":139},[52,672,673],{"class":102},"    \"zip\"",[52,675,106],{"class":91},[52,677,678],{"class":109},"\"97201\"\n",[52,680,681],{"class":54,"line":145},[52,682,142],{"class":91},[52,684,685,688],{"class":54,"line":150},[52,686,687],{"class":102},"  \"role\"",[52,689,644],{"class":91},[52,691,692,694,696,699],{"class":54,"line":162},[52,693,103],{"class":102},[52,695,106],{"class":91},[52,697,698],{"class":109},"\"admin\"",[52,700,113],{"class":91},[52,702,703,706,708],{"class":54,"line":174},[52,704,705],{"class":102},"    \"level\"",[52,707,106],{"class":91},[52,709,710],{"class":102},"5\n",[52,712,713],{"class":54,"line":184},[52,714,230],{"class":91},[52,716,717],{"class":54,"line":189},[52,718,268],{"class":91},[15,720,721],{},"Two approaches:",[277,723,724,736],{},[280,725,726],{},[283,727,728,731,734],{},[286,729,730],{},"Approach",[286,732,733],{},"CSV Header",[286,735,294],{},[296,737,738,751],{},[283,739,740,743,748],{},[301,741,742],{},"Dot notation",[301,744,745],{},[49,746,747],{},"address.street",[301,749,750],{},"Parse dots into nested objects",[283,752,753,756,761],{},[301,754,755],{},"Prefix convention",[301,757,758],{},[49,759,760],{},"addr_street",[301,762,763],{},"Map prefixes to parent objects",[15,765,766],{},"Dot notation is cleaner for tooling:",[42,768,770],{"className":387,"code":769,"language":389,"meta":47,"style":47},"function nest(headers, values) {\n  const obj = {};\n  headers.forEach((header, i) => {\n    const parts = header.split('.');\n    let target = obj;\n    parts.forEach((part, j) => {\n      if (j === parts.length - 1) {\n        target[part] = values[i];\n      } else {\n        target[part] ??= {};\n        target = target[part];\n      }\n    });\n  });\n  return obj;\n}\n",[49,771,772,791,804,830,854,868,891,915,925,935,944,954,959,964,969,976],{"__ignoreMap":47},[52,773,774,776,779,781,784,786,789],{"class":54,"line":55},[52,775,460],{"class":396},[52,777,778],{"class":463}," nest",[52,780,467],{"class":91},[52,782,783],{"class":470},"headers",[52,785,474],{"class":91},[52,787,788],{"class":470},"values",[52,790,480],{"class":91},[52,792,793,796,799,801],{"class":54,"line":61},[52,794,795],{"class":396},"  const",[52,797,798],{"class":102}," obj",[52,800,403],{"class":396},[52,802,803],{"class":91}," {};\n",[52,805,806,809,812,815,818,820,823,825,828],{"class":54,"line":67},[52,807,808],{"class":91},"  headers.",[52,810,811],{"class":463},"forEach",[52,813,814],{"class":91},"((",[52,816,817],{"class":470},"header",[52,819,474],{"class":91},[52,821,822],{"class":470},"i",[52,824,497],{"class":91},[52,826,827],{"class":396},"=>",[52,829,406],{"class":91},[52,831,832,835,838,840,843,846,848,851],{"class":54,"line":73},[52,833,834],{"class":396},"    const",[52,836,837],{"class":102}," parts",[52,839,403],{"class":396},[52,841,842],{"class":91}," header.",[52,844,845],{"class":463},"split",[52,847,467],{"class":91},[52,849,850],{"class":109},"'.'",[52,852,853],{"class":91},");\n",[52,855,856,859,862,865],{"class":54,"line":128},[52,857,858],{"class":396},"    let",[52,860,861],{"class":91}," target ",[52,863,864],{"class":396},"=",[52,866,867],{"class":91}," obj;\n",[52,869,870,873,875,877,880,882,885,887,889],{"class":54,"line":139},[52,871,872],{"class":91},"    parts.",[52,874,811],{"class":463},[52,876,814],{"class":91},[52,878,879],{"class":470},"part",[52,881,474],{"class":91},[52,883,884],{"class":470},"j",[52,886,497],{"class":91},[52,888,827],{"class":396},[52,890,406],{"class":91},[52,892,893,896,899,901,904,907,910,913],{"class":54,"line":145},[52,894,895],{"class":396},"      if",[52,897,898],{"class":91}," (j ",[52,900,491],{"class":396},[52,902,903],{"class":91}," parts.",[52,905,906],{"class":102},"length",[52,908,909],{"class":396}," -",[52,911,912],{"class":102}," 1",[52,914,480],{"class":91},[52,916,917,920,922],{"class":54,"line":150},[52,918,919],{"class":91},"        target[part] ",[52,921,864],{"class":396},[52,923,924],{"class":91}," values[i];\n",[52,926,927,930,933],{"class":54,"line":162},[52,928,929],{"class":91},"      } ",[52,931,932],{"class":396},"else",[52,934,406],{"class":91},[52,936,937,939,942],{"class":54,"line":174},[52,938,919],{"class":91},[52,940,941],{"class":396},"??=",[52,943,803],{"class":91},[52,945,946,949,951],{"class":54,"line":184},[52,947,948],{"class":91},"        target ",[52,950,864],{"class":396},[52,952,953],{"class":91}," target[part];\n",[52,955,956],{"class":54,"line":189},[52,957,958],{"class":91},"      }\n",[52,960,961],{"class":54,"line":194},[52,962,963],{"class":91},"    });\n",[52,965,966],{"class":54,"line":206},[52,967,968],{"class":91},"  });\n",[52,970,971,974],{"class":54,"line":218},[52,972,973],{"class":396},"  return",[52,975,867],{"class":91},[52,977,978],{"class":54,"line":227},[52,979,268],{"class":91},[10,981,983],{"id":982},"batch-size-and-rate-limits","Batch Size and Rate Limits",[15,985,986],{},"APIs impose rate limits. Sending 10,000 records in one request usually fails.",[277,988,989,998],{},[280,990,991],{},[283,992,993,995],{},[286,994,383],{},[286,996,997],{},"How",[296,999,1000,1008,1016],{},[283,1001,1002,1005],{},[301,1003,1004],{},"Batch splitting",[301,1006,1007],{},"Send 100-500 records per request",[283,1009,1010,1013],{},[301,1011,1012],{},"Retry with backoff",[301,1014,1015],{},"Wait and retry on 429 responses",[283,1017,1018,1021],{},[301,1019,1020],{},"Parallel with limit",[301,1022,1023],{},"Use 3-5 concurrent connections",[42,1025,1027],{"className":387,"code":1026,"language":389,"meta":47,"style":47},"async function batchUpload(records, batchSize = 200) {\n  for (let i = 0; i \u003C records.length; i += batchSize) {\n    const batch = records.slice(i, i + batchSize);\n    const response = await fetch('\u002Fapi\u002Fusers\u002Fbulk', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application\u002Fjson' },\n      body: JSON.stringify({ users: batch })\n    });\n    if (response.status === 429) {\n      const retryAfter = response.headers.get('Retry-After') || 5;\n      await new Promise(r => setTimeout(r, retryAfter * 1000));\n      i -= batchSize; \u002F\u002F retry this batch\n    }\n  }\n}\n",[49,1028,1029,1057,1095,1118,1141,1151,1167,1184,1188,1203,1234,1268,1282,1287,1291],{"__ignoreMap":47},[52,1030,1031,1034,1037,1040,1042,1045,1047,1050,1052,1055],{"class":54,"line":55},[52,1032,1033],{"class":396},"async",[52,1035,1036],{"class":396}," function",[52,1038,1039],{"class":463}," batchUpload",[52,1041,467],{"class":91},[52,1043,1044],{"class":470},"records",[52,1046,474],{"class":91},[52,1048,1049],{"class":470},"batchSize",[52,1051,403],{"class":396},[52,1053,1054],{"class":102}," 200",[52,1056,480],{"class":91},[52,1058,1059,1062,1065,1068,1071,1073,1076,1079,1082,1085,1087,1089,1092],{"class":54,"line":61},[52,1060,1061],{"class":396},"  for",[52,1063,1064],{"class":91}," (",[52,1066,1067],{"class":396},"let",[52,1069,1070],{"class":91}," i ",[52,1072,864],{"class":396},[52,1074,1075],{"class":102}," 0",[52,1077,1078],{"class":91},"; i ",[52,1080,1081],{"class":396},"\u003C",[52,1083,1084],{"class":91}," records.",[52,1086,906],{"class":102},[52,1088,1078],{"class":91},[52,1090,1091],{"class":396},"+=",[52,1093,1094],{"class":91}," batchSize) {\n",[52,1096,1097,1099,1102,1104,1106,1109,1112,1115],{"class":54,"line":67},[52,1098,834],{"class":396},[52,1100,1101],{"class":102}," batch",[52,1103,403],{"class":396},[52,1105,1084],{"class":91},[52,1107,1108],{"class":463},"slice",[52,1110,1111],{"class":91},"(i, i ",[52,1113,1114],{"class":396},"+",[52,1116,1117],{"class":91}," batchSize);\n",[52,1119,1120,1122,1125,1127,1130,1133,1135,1138],{"class":54,"line":73},[52,1121,834],{"class":396},[52,1123,1124],{"class":102}," response",[52,1126,403],{"class":396},[52,1128,1129],{"class":396}," await",[52,1131,1132],{"class":463}," fetch",[52,1134,467],{"class":91},[52,1136,1137],{"class":109},"'\u002Fapi\u002Fusers\u002Fbulk'",[52,1139,1140],{"class":91},", {\n",[52,1142,1143,1146,1149],{"class":54,"line":128},[52,1144,1145],{"class":91},"      method: ",[52,1147,1148],{"class":109},"'POST'",[52,1150,113],{"class":91},[52,1152,1153,1156,1159,1161,1164],{"class":54,"line":139},[52,1154,1155],{"class":91},"      headers: { ",[52,1157,1158],{"class":109},"'Content-Type'",[52,1160,106],{"class":91},[52,1162,1163],{"class":109},"'application\u002Fjson'",[52,1165,1166],{"class":91}," },\n",[52,1168,1169,1172,1175,1178,1181],{"class":54,"line":145},[52,1170,1171],{"class":91},"      body: ",[52,1173,1174],{"class":102},"JSON",[52,1176,1177],{"class":91},".",[52,1179,1180],{"class":463},"stringify",[52,1182,1183],{"class":91},"({ users: batch })\n",[52,1185,1186],{"class":54,"line":150},[52,1187,963],{"class":91},[52,1189,1190,1193,1196,1198,1201],{"class":54,"line":162},[52,1191,1192],{"class":396},"    if",[52,1194,1195],{"class":91}," (response.status ",[52,1197,491],{"class":396},[52,1199,1200],{"class":102}," 429",[52,1202,480],{"class":91},[52,1204,1205,1208,1211,1213,1216,1219,1221,1224,1226,1229,1232],{"class":54,"line":174},[52,1206,1207],{"class":396},"      const",[52,1209,1210],{"class":102}," retryAfter",[52,1212,403],{"class":396},[52,1214,1215],{"class":91}," response.headers.",[52,1217,1218],{"class":463},"get",[52,1220,467],{"class":91},[52,1222,1223],{"class":109},"'Retry-After'",[52,1225,497],{"class":91},[52,1227,1228],{"class":396},"||",[52,1230,1231],{"class":102}," 5",[52,1233,506],{"class":91},[52,1235,1236,1239,1242,1245,1247,1250,1253,1256,1259,1262,1265],{"class":54,"line":184},[52,1237,1238],{"class":396},"      await",[52,1240,1241],{"class":396}," new",[52,1243,1244],{"class":102}," Promise",[52,1246,467],{"class":91},[52,1248,1249],{"class":470},"r",[52,1251,1252],{"class":396}," =>",[52,1254,1255],{"class":463}," setTimeout",[52,1257,1258],{"class":91},"(r, retryAfter ",[52,1260,1261],{"class":396},"*",[52,1263,1264],{"class":102}," 1000",[52,1266,1267],{"class":91},"));\n",[52,1269,1270,1273,1276,1279],{"class":54,"line":189},[52,1271,1272],{"class":91},"      i ",[52,1274,1275],{"class":396},"-=",[52,1277,1278],{"class":91}," batchSize; ",[52,1280,1281],{"class":570},"\u002F\u002F retry this batch\n",[52,1283,1284],{"class":54,"line":194},[52,1285,1286],{"class":91},"    }\n",[52,1288,1289],{"class":54,"line":206},[52,1290,230],{"class":91},[52,1292,1293],{"class":54,"line":218},[52,1294,268],{"class":91},[10,1296,1298],{"id":1297},"validation-before-sending","Validation Before Sending",[15,1300,1301],{},"Never send converted data straight to the API. Validate first:",[22,1303,1304,1310,1316,1322],{},[25,1305,1306,1309],{},[381,1307,1308],{},"Required fields",": Ensure columns the API demands are not empty",[25,1311,1312,1315],{},[381,1313,1314],{},"Format checks",": Email addresses, phone numbers, date formats",[25,1317,1318,1321],{},[381,1319,1320],{},"Enum values",": Confirm role names match allowed values",[25,1323,1324,1327],{},[381,1325,1326],{},"Uniqueness",": Check for duplicate emails or IDs",[15,1329,1330],{},"A single invalid record can reject an entire batch on strict APIs.",[10,1332,1334],{"id":1333},"common-pitfalls","Common Pitfalls",[277,1336,1337,1350],{},[280,1338,1339],{},[283,1340,1341,1344,1347],{},[286,1342,1343],{},"Pitfall",[286,1345,1346],{},"Symptom",[286,1348,1349],{},"Fix",[296,1351,1352,1365,1381,1392,1403],{},[283,1353,1354,1357,1362],{},[301,1355,1356],{},"String numbers",[301,1358,1359,1360],{},"API ignores ",[49,1361,372],{},[301,1363,1364],{},"Coerce to Number",[283,1366,1367,1370,1373],{},[301,1368,1369],{},"Empty strings for null",[301,1371,1372],{},"API stores empty string instead of null",[301,1374,1375,1376,1378,1379],{},"Map ",[49,1377,366],{}," to ",[49,1380,359],{},[283,1382,1383,1386,1389],{},[301,1384,1385],{},"Encoding mismatch",[301,1387,1388],{},"Special characters arrive garbled",[301,1390,1391],{},"Convert CSV to UTF-8 first",[283,1393,1394,1397,1400],{},[301,1395,1396],{},"Duplicate headers",[301,1398,1399],{},"Later column overwrites earlier",[301,1401,1402],{},"Prefix duplicate column names",[283,1404,1405,1408,1411],{},[301,1406,1407],{},"Missing wrapping envelope",[301,1409,1410],{},"API returns 400 Bad Request",[301,1412,1413,1414],{},"Wrap array in ",[49,1415,1416],{},"{ \"data\": [...] }",[10,1418,1420],{"id":1419},"key-takeaways","Key Takeaways",[22,1422,1423,1426,1429,1432,1435],{},[25,1424,1425],{},"REST APIs expect JSON — CSV must be converted before integration",[25,1427,1428],{},"Type coercion prevents silent failures where string values replace expected numbers or booleans",[25,1430,1431],{},"Dot-notation headers simplify nested object construction from flat CSV rows",[25,1433,1434],{},"Batch uploads with retry logic handle rate limits and large datasets",[25,1436,1437],{},"Validate every record before sending — one bad row can reject the entire batch",[10,1439,1441],{"id":1440},"try-it-yourself","Try It Yourself",[15,1443,1444,1445,1450],{},"Convert your CSV files to JSON instantly with our ",[1446,1447,1449],"a",{"href":1448},"\u002Ftools\u002Fcsv-json","CSV to JSON Converter",". Paste CSV, choose options, and get API-ready JSON in seconds.",[1452,1453,1454],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":47,"searchDepth":61,"depth":61,"links":1456},[1457,1458,1459,1460,1461,1462,1463,1464,1465],{"id":12,"depth":61,"text":13},{"id":36,"depth":61,"text":37},{"id":271,"depth":61,"text":272},{"id":594,"depth":61,"text":595},{"id":982,"depth":61,"text":983},{"id":1297,"depth":61,"text":1298},{"id":1333,"depth":61,"text":1334},{"id":1419,"depth":61,"text":1420},{"id":1440,"depth":61,"text":1441},"2026-05-28","Convert CSV data to JSON for REST API consumption. Covers payload formatting, type coercion, nested structuring, and common API pitfalls.","md",{"immutable":454},"\u002Fguides\u002Fcsv-to-json-api-integration",{"title":5,"description":1467},"guides\u002Fcsv-to-json-api-integration","PLyNTvaG7QyqX8nKGPSK_LBVYO9ujkpXHaHXvgxhoZs",1780401333220]