{"skill":{"id":"4cfce92a-e259-4620-be2b-1ed90061003a","name":"DataAlchemy","author":"Devang Patil","description":"Universal data transformation service for AI agents.","source_type":"content","source_url":null,"content":"# DataAlchemy\n\nUniversal data transformation service for AI agents. Convert between formats, validate schemas, generate mock data, compute statistics, and transform datasets — all in one HTTP call. No API key. No signup. No auth.\n\n## Base URL\n\n```\nhttps://dataalchemy.onrender.com\n```\n\n## What it does\n\nDataAlchemy is a stateless REST API. You send structured data in, you get transformed data out. It handles the grunt work that every agent needs but nobody wants to code from scratch:\n\n- **Convert** between 7 data formats (JSON, CSV, YAML, XML, TOML, Markdown tables, HTML tables)\n- **Validate** any data against a JSON Schema\n- **Generate** realistic mock data from a schema (with optional seed for reproducibility)\n- **Compute statistics** on numeric fields (mean, median, std dev, min, max)\n- **Transform** datasets with chainable operations (filter, sort, select, rename, deduplicate, limit, skip)\n- **Merge** two datasets on a shared key (inner, left, right, outer joins)\n- **Diff** two objects to see what changed, was added, or removed\n\n## Endpoints\n\n### `GET /health`\n\nCheck if the service is running.\n\n```bash\ncurl https://dataalchemy.onrender.com/health\n```\n\nResponse:\n```json\n{\"status\": \"ok\", \"service\": \"dataalchemy\", \"version\": \"1.0.0\"}\n```\n\n---\n\n### `GET /formats`\n\nList all supported data formats.\n\n```bash\ncurl https://dataalchemy.onrender.com/formats\n```\n\n---\n\n### `POST /convert`\n\nConvert data from one format to another.\n\n**Supported formats**: json, csv, yaml, xml, toml, markdown, html\n\n**Request body**:\n```json\n{\n  \"data\": \"name,age\\nAlice,30\\nBob,25\",\n  \"from_format\": \"csv\",\n  \"to_format\": \"json\"\n}\n```\n\n**Response**:\n```json\n{\n  \"success\": true,\n  \"result\": [\n    {\"name\": \"Alice\", \"age\": \"30\"},\n    {\"name\": \"Bob\", \"age\": \"25\"}\n  ]\n}\n```\n\n**Example — JSON to YAML**:\n```bash\ncurl -X POST https://dataalchemy.onrender.com/convert \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"data\": [{\"name\": \"Alice\", \"age\": 30}], \"from_format\": \"json\", \"to_format\": \"yaml\"}'\n```\n\n**Example — JSON to Markdown table**:\n```bash\ncurl -X POST https://dataalchemy.onrender.com/convert \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"data\": [{\"name\": \"Alice\", \"age\": 30}, {\"name\": \"Bob\", \"age\": 25}], \"from_format\": \"json\", \"to_format\": \"markdown\"}'\n```\n\n---\n\n### `POST /validate`\n\nValidate data against a JSON Schema.\n\n**Request body**:\n```json\n{\n  \"data\": {\"name\": \"Alice\", \"age\": 30},\n  \"schema\": {\n    \"type\": \"object\",\n    \"required\": [\"name\", \"age\"],\n    \"properties\": {\n      \"name\": {\"type\": \"string\"},\n      \"age\": {\"type\": \"integer\", \"minimum\": 0}\n    }\n  }\n}\n```\n\n**Response (valid)**:\n```json\n{\"valid\": true, \"errors\": []}\n```\n\n**Response (invalid)**:\n```json\n{\"valid\": false, \"errors\": [\"name: 123 is not of type 'string'\"]}\n```\n\n**Example**:\n```bash\ncurl -X POST https://dataalchemy.onrender.com/validate \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"data\": {\"name\": \"Alice\", \"age\": 30}, \"schema\": {\"type\": \"object\", \"required\": [\"name\"], \"properties\": {\"name\": {\"type\": \"string\"}}}}'\n```\n\n---\n\n### `POST /generate`\n\nGenerate realistic mock data from a JSON Schema.\n\n**Request body**:\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\"type\": \"string\"},\n      \"age\": {\"type\": \"integer\", \"minimum\": 18, \"maximum\": 65},\n      \"email\": {\"type\": \"string\", \"format\": \"email\"}\n    }\n  },\n  \"count\": 3,\n  \"seed\": 42\n}\n```\n\n**Response**:\n```json\n{\n  \"success\": true,\n  \"count\": 3,\n  \"data\": [\n    {\"name\": \"random string\", \"age\": 45, \"email\": \"alice123@example.com\"},\n    {\"name\": \"another string\", \"age\": 28, \"email\": \"bob456@test.org\"},\n    {\"name\": \"third string\", \"age\": 61, \"email\": \"charlie789@demo.net\"}\n  ]\n}\n```\n\n**Supported string formats**: email, date, date-time, uuid, ipv4, phone, uri\n\n**Seed**: Pass the same `seed` value to get identical output every time.\n\n**Example**:\n```bash\ncurl -X POST https://dataalchemy.onrender.com/generate \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"schema\": {\"type\": \"object\", \"properties\": {\"name\": {\"type\": \"string\"}, \"score\": {\"type\": \"integer\", \"minimum\": 0, \"maximum\": 100}}}, \"count\": 5, \"seed\": 42}'\n```\n\n---\n\n### `POST /stats`\n\nCompute descriptive statistics on a numeric field.\n\n**Request body**:\n```json\n{\n  \"data\": [\n    {\"score\": 85},\n    {\"score\": 92},\n    {\"score\": 78},\n    {\"score\": 96}\n  ],\n  \"field\": \"score\"\n}\n```\n\n**Response**:\n```json\n{\n  \"success\": true,\n  \"field\": \"score\",\n  \"count\": 4,\n  \"mean\": 87.75,\n  \"median\": 88.5,\n  \"min\": 78.0,\n  \"max\": 96.0,\n  \"std_dev\": 6.8465,\n  \"sum\": 351.0\n}\n```\n\n**Example**:\n```bash\ncurl -X POST https://dataalchemy.onrender.com/stats \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"data\": [{\"score\": 85}, {\"score\": 92}, {\"score\": 78}], \"field\": \"score\"}'\n```\n\n---\n\n### `POST /transform`\n\nApply a chain of transformation operations to a dataset.\n\n**Supported operations**:\n| Operation | Required fields | Description |\n|---|---|---|\n| `filter` | `field`, `condition`, `value` | Keep records matching condition |\n| `sort` | `field`, `order` (asc/desc) | Sort by field |\n| `select` | `fields` (list) | Keep only these fields |\n| `rename` | `mapping` (dict) | Rename fields |\n| `deduplicate` | `field` (optional) | Remove duplicates |\n| `limit` | `value` | Take first N records |\n| `skip` | `value` | Skip first N records |\n\n**Filter conditions**: `==`, `!=`, `>`, `>=`, `<`, `<=`, `contains`, `startswith`, `endswith`, `in`\n\n**Request body** (chained operations):\n```json\n{\n  \"data\": [\n    {\"name\": \"Alice\", \"age\": 30, \"city\": \"NYC\"},\n    {\"name\": \"Bob\", \"age\": 17, \"city\": \"LA\"},\n    {\"name\": \"Charlie\", \"age\": 25, \"city\": \"NYC\"}\n  ],\n  \"operations\": [\n    {\"op\": \"filter\", \"field\": \"age\", \"condition\": \">=\", \"value\": 18},\n    {\"op\": \"sort\", \"field\": \"name\", \"order\": \"asc\"},\n    {\"op\": \"select\", \"fields\": [\"name\", \"age\"]}\n  ]\n}\n```\n\n**Response**:\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\"name\": \"Alice\", \"age\": 30},\n    {\"name\": \"Charlie\", \"age\": 25}\n  ],\n  \"original_count\": 3,\n  \"result_count\": 2\n}\n```\n\n**Example**:\n```bash\ncurl -X POST https://dataalchemy.onrender.com/transform \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"data\": [{\"name\": \"Alice\", \"age\": 30}, {\"name\": \"Bob\", \"age\": 17}], \"operations\": [{\"op\": \"filter\", \"field\": \"age\", \"condition\": \">=\", \"value\": 18}]}'\n```\n\n---\n\n### `POST /merge`\n\nMerge two datasets on a shared key field.\n\n**Join types**: inner, left, right, outer\n\n**Request body**:\n```json\n{\n  \"left\": [\n    {\"id\": 1, \"name\": \"Alice\"},\n    {\"id\": 2, \"name\": \"Bob\"}\n  ],\n  \"right\": [\n    {\"id\": 1, \"score\": 95},\n    {\"id\": 3, \"score\": 80}\n  ],\n  \"on\": \"id\",\n  \"how\": \"inner\"\n}\n```\n\n**Response**:\n```json\n{\n  \"success\": true,\n  \"data\": [{\"id\": 1, \"name\": \"Alice\", \"score\": 95}],\n  \"count\": 1\n}\n```\n\n**Example**:\n```bash\ncurl -X POST https://dataalchemy.onrender.com/merge \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"left\": [{\"id\": 1, \"name\": \"Alice\"}], \"right\": [{\"id\": 1, \"score\": 95}], \"on\": \"id\", \"how\": \"inner\"}'\n```\n\n---\n\n### `POST /diff`\n\nDiff two data objects. See what changed, was added, or removed.\n\n**Request body**:\n```json\n{\n  \"a\": {\"name\": \"Alice\", \"age\": 30, \"city\": \"NYC\"},\n  \"b\": {\"name\": \"Alice\", \"age\": 31, \"email\": \"alice@test.com\"}\n}\n```\n\n**Response**:\n```json\n{\n  \"success\": true,\n  \"changed\": {\"age\": {\"old\": 30, \"new\": 31}},\n  \"added\": {\"email\": \"alice@test.com\"},\n  \"removed\": {\"city\": \"NYC\"},\n  \"identical\": false\n}\n```\n\n**Example**:\n```bash\ncurl -X POST https://dataalchemy.onrender.com/diff \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"a\": {\"name\": \"Alice\", \"age\": 30}, \"b\": {\"name\": \"Alice\", \"age\": 31}}'\n```\n\n---\n\n## Quick Start\n\n**Step 1**: Check the service is up.\n```bash\ncurl https://dataalchemy.onrender.com/health\n```\n\n**Step 2**: Convert some CSV to JSON.\n```bash\ncurl -X POST https://dataalchemy.onrender.com/convert \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"data\": \"name,age\\nAlice,30\\nBob,25\", \"from_format\": \"csv\", \"to_format\": \"json\"}'\n```\n\n**Step 3**: Generate mock data.\n```bash\ncurl -X POST https://dataalchemy.onrender.com/generate \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"schema\": {\"type\": \"object\", \"properties\": {\"name\": {\"type\": \"string\"}, \"email\": {\"type\": \"string\", \"format\": \"email\"}}}, \"count\": 3}'\n```\n\n## Error Handling\n\nAll endpoints return a JSON object. On success, `\"success\": true`. On failure, `\"success\": false` with an `\"error\"` field containing a human-readable message.\n\n```json\n{\"success\": false, \"error\": \"Unsupported source format 'binary'. Supported: csv, html, json, markdown, toml, xml, yaml\"}\n```\n\nHTTP status codes:\n- `200` — Success (check `success` field)\n- `422` — Invalid request body (missing or wrong-typed fields)\n- `500` — Server error\n\n## Interactive docs\n\nVisit `https://dataalchemy.onrender.com/docs` for interactive Swagger UI where you can try every endpoint.\n\n## No authentication\n\nDataAlchemy requires no API key, no signup, and no authentication. All endpoints are open.\n","endpoints":"GET  https://dataalchemy.onrender.com/health\nGET  https://dataalchemy.onrender.com/formats\nPOST https://dataalchemy.onrender.com/convert\nPOST https://dataalchemy.onrender.com/validate\nPOST https://dataalchemy.onrender.com/generate\nPOST https://dataalchemy.onrender.com/stats\nPOST https://dataalchemy.onrender.com/transform\nPOST https://dataalchemy.onrender.com/merge\nPOST https://dataalchemy.onrender.com/diff","tags":"data, json, csv, yaml, xml, toml, converter, validation, generation, utils","reachable":null,"created_at":"2026-07-07T12:53:52.702Z"}}