---
title: "Update Contact"
full: true
_openapi:
  method: PATCH
  toc: []
  structuredData:
    headings: []
    contents:
      - content: "Updates an existing contact's information"
_apiData:
  document: "https://reloop.sh/api/contacts/openapi/json"
  operationData: [{"path":"/api/contacts/{contact_id}","method":"patch"}]
  parameterList: [{"name":"contact_id","type":"string","required":true,"description":"Unique contact identifier","location":"path","example":"cont_123456789"},{"name":"email","type":"string","required":false,"description":"Contact email address","location":"body","pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"},{"name":"firstName","type":"string","required":false,"description":"Contact first name","location":"body"},{"name":"lastName","type":"string","required":false,"description":"Contact last name","location":"body"},{"name":"status","type":"\"subscribed\" | \"unsubscribed\" | \"blocked\"","required":false,"description":"","location":"body","enumValues":["subscribed","unsubscribed","blocked"]},{"name":"properties","type":"object","required":false,"description":"Contact properties as key-value pairs to update","location":"body"}]
  responseMap: {"200":{"description":"Response for status 200","schema":{"object":"contact","id":"con_123456789","email":"john.doe@example.com","firstName":"John","lastName":"Doe","status":"subscribed","properties":{"company":"Reloop","role":"Developer"},"groups":[{"id":"grp_123456789","name":"Beta Testers"}],"channels":[{"id":"channel_123456789","name":"Newsletter","subscription":"opt_in"}],"suppressionReason":null,"suppressedAt":null,"createdAt":"2026-03-23T10:00:00.000Z","updatedAt":"2026-03-23T10:00:00.000Z","event":"evt_123456789"}},"400":{"description":"Response for status 400","schema":{"message":"Contact already exists","errors":[{"field":"example_field","message":"Contact already exists"}]}},"403":{"description":"Response for status 403","schema":{"message":"Unauthorized access","why":"A contact with this email already exists in your organization.","fix":"Use a different email address or update the existing contact instead."}},"404":{"description":"Response for status 404","schema":{"message":"Contact not found","why":"A contact with this email already exists in your organization.","fix":"Use a different email address or update the existing contact instead."}}}
  codeSamples: [{"id":"node","lang":"js","label":"Node.js","source":"import Reloop from 'reloop-email';\n\nconst reloop = new Reloop('re_123456789');\n\nconst { response: contact, error } = await reloop.contacts().update('cont_123456789', {\n  firstName: 'Jane',\n  lastName: 'Smith',\n  status: 'subscribed',\n  properties: {\n    company: 'Reloop',\n    role: 'Designer',\n  },\n});\nif (error) throw error;"},{"id":"curl","lang":"bash","label":"cURL","source":"curl -X PATCH https://reloop.sh/api/contacts/cont_123456789 \\\n  -H \"x-api-key: re_123456789\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Smith\",\n  \"status\": \"subscribed\",\n  \"properties\": {\n    \"company\": \"Reloop\",\n    \"role\": \"Designer\"\n  }\n}'"},{"id":"php","lang":"php","label":"PHP","source":"$reloop = Reloop::client('re_123456789');\n\n$reloop->contacts->update(\n  'cont_123456789',\n  parameters: [\n      'first_name' => 'Jane',\n      'last_name' => 'Smith',\n      'unsubscribed' => false,\n      'properties' => [\n          'company' => 'Reloop',\n          'role' => 'Designer',\n      ],\n  ],\n);"},{"id":"python","lang":"python","label":"Python","source":"from reloop_email import Reloop\n\nreloop = Reloop(api_key=\"re_123456789\")\n\nreloop.contacts().update(\n    \"cont_123456789\",\n    first_name=\"Jane\",\n    last_name=\"Smith\",\n    unsubscribed=False,\n    properties={\n        \"company\": \"Reloop\",\n        \"role\": \"Designer\",\n    },\n)"},{"id":"ruby","lang":"ruby","label":"Ruby","source":"require 'net/http'\nrequire 'json'\n\nuri = URI('https://reloop.sh/api/contacts/cont_123456789')\nhttp = Net::HTTP.new(uri.host, uri.port)\nhttp.use_ssl = true\n\nrequest = Net::HTTP::Patch.new(uri)\nrequest['x-api-key'] = 're_123456789'\nrequest['Content-Type'] = 'application/json'\nrequest.body = {\n  firstName: 'Jane',\n  lastName: 'Smith',\n  status: 'subscribed',\n  properties: {\n    company: 'Reloop',\n    role: 'Designer',\n  },\n}.to_json\n\nresponse = http.request(request)\ncontact = JSON.parse(response.body)"},{"id":"go","lang":"go","label":"Go","source":"import reloopemail \"github.com/reloop-labs/reloop-email\"\n\nfunc main() {\n    reloop, _ := reloopemail.NewClient(reloopemail.ClientOptions{\n        APIKey: \"re_123456789\",\n    })\n    \n    _, _ = reloop.Contacts().Update(\"cont_123456789\", map[string]interface{}{\n        \"first_name\": \"Jane\",\n        \"last_name\": \"Smith\",\n        \"unsubscribed\": false,\n        \"properties\": map[string]interface{}{\"company\": \"Reloop\", \"role\": \"Designer\"}\n    })\n}"},{"id":"rust","lang":"rust","label":"Rust","source":"use reloop_email::ReloopEmail;\nuse serde_json::json;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    let reloop = ReloopEmail::new(\"re_123456789\".to_string(), None);\n    \n    reloop.contacts().update(\"cont_123456789\", json!({\n        \"first_name\": \"Jane\",\n        \"last_name\": \"Smith\",\n        \"unsubscribed\": false,\n        \"properties\": {\n        \"company\": \"Reloop\",\n        \"role\": \"Designer\",\n    },\n    })).await?;\n\n    Ok(())\n}"},{"id":"java","lang":"java","label":"Java","source":"import sh.reloop.email.ReloopEmail;\nimport java.util.*;\n\nReloopEmail reloop = ReloopEmail.client(\"re_123456789\");\n\nreloop.contacts().update(\"cont_123456789\", Map.of(\"first_name\", \"Jane\", \"last_name\", \"Smith\", \"unsubscribed\", false, \"properties\", Map.of(\"company\", \"Reloop\", \"role\", \"Designer\")));"},{"id":"dotnet","lang":"csharp","label":".NET","source":"using Reloop.Email;\nusing System.Collections.Generic;\n\nvar reloop = ReloopEmail.Client(\"re_123456789\");\n\nvar parameters = new Dictionary<string, object?>();\nparameters[\"first_name\"] = \"Jane\";\nparameters[\"last_name\"] = \"Smith\";\nparameters[\"unsubscribed\"] = false;\nparameters[\"properties\"] = new Dictionary<string, object?>\n{\n    [\"company\"] = \"Reloop\",\n    [\"role\"] = \"Designer\",\n};\nawait reloop.Contacts().UpdateAsync(\"cont_123456789\", parameters);"}]
---
> For the complete documentation index, see [llms-docs.txt](/llms-docs.txt) or the site index [llms.txt](/llms.txt). Full docs corpus: [llms-full-docs.txt](/llms-full-docs.txt). Prefer markdown URLs (append `.md`) for agent consumption. Product skill: [skill.md](/skill.md).


{/* This file was generated by the OpenAPI doc generator. Do not edit this file directly. Run `bun run generate:api-docs` to regenerate. */}

<APIPage />
