Contacts API
Contacts with properties, consent, double opt-in, imports, exports and custom events.
15 operations. Guide: Manage contacts and consent, Let recipients unsubscribe. Requests and responses are JSON with snake_case fields; authenticate with Authorization: Bearer <api key>. The examples assume a client built as in SDKs and the command line.
Create a contact
POST /v1/contacts
Properties must be defined first; topics and static segments must exist. The consent ledger records the subscription, and an unsubscribed contact's address is suppressed on the marketing stream.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
email | string | yes | An email address without display name. |
first_name | string or null | no | At most 100 characters. |
last_name | string or null | no | At most 100 characters. |
unsubscribed | boolean | no | |
properties | map of string or number or boolean or null | no | |
segments | array of object | no | At most 50 items. |
segments[]. | string | yes | A UUID. |
topics | array of object | no | At most 50 items. |
topics[]. | string | yes | A UUID. |
topics[]. | one of "opt_in", "opt_out" | yes | |
source | string | no | At most 100 characters. |
Response
201 Created: Contact.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "contact" | yes | |
project_id | string | yes | A UUID. |
email | string | yes | |
first_name | string or null | yes | |
last_name | string or null | yes | |
unsubscribed | boolean | yes | |
status | one of "active", "unsubscribed", "bounced", "complained", "sunset" | yes | |
properties | map of string or number or boolean or null | yes | |
topics | array of object | yes | |
topics[]. | string | yes | A UUID. |
topics[]. | one of "opt_in", "opt_out" | yes | |
segment_ids | array of string | yes | |
last_sent_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
last_opened_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
last_clicked_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
updated_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/contacts \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"jane@example.com","first_name":"Jane","last_name":"Doe"}'const result = await minket.contacts.create({
email: "jane@example.com",
first_name: "Jane",
last_name: "Doe"
});minket api createContact --body '{"email":"jane@example.com","first_name":"Jane","last_name":"Doe"}'from minket.api.contacts import create_contact
from minket.models import CreateContactBody
result = create_contact.sync(client=client, body=CreateContactBody.from_dict({"email":"jane@example.com","first_name":"Jane","last_name":"Doe"}))var body minket.CreateContactJSONRequestBody
res, err := client.CreateContactWithResponse(ctx, body)List contacts
GET /v1/contacts
Newest first. email matches part of the address.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | integer | no | Default 20. |
after | query | string | no | A UUID. |
before | query | string | no | A UUID. |
email | query | string | no | |
segment_id | query | string | no | A UUID. |
topic_id | query | string | no | A UUID. |
status | query | one of "active", "unsubscribed", "bounced", "complained", "sunset" | no |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "list" | yes | |
data | array of object | yes | |
data[]. | string | yes | A UUID. |
data[]. | "contact" | yes | |
data[]. | string | yes | A UUID. |
data[]. | string | yes | |
data[]. | string or null | yes | |
data[]. | string or null | yes | |
data[]. | boolean | yes | |
data[]. | one of "active", "unsubscribed", "bounced", "complained", "sunset" | yes | |
data[]. | map of string or number or boolean or null | yes | |
data[]. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
has_more | boolean | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/contacts \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.contacts.list();minket api listContactsfrom minket.api.contacts import list_contacts
result = list_contacts.sync(client=client)res, err := client.ListContactsWithResponse(ctx, &minket.ListContactsParams{})Import contacts from CSV
POST /v1/contacts/import
Up to 4 MB inline as base64 content, up to 50 MB through POST /v1/uploads (purpose import) and upload_id. Processed in the background; poll the import for its counts and row errors.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
content | string | no | At most 5592410 characters. |
upload_id | string | no | A UUID. |
column_map | object | no | Default {"email":"email"}. |
column_map. | string | no | Default "email". |
column_map. | string | no | |
column_map. | string | no | |
column_map. | string | no | |
column_map. | map of object | no | |
on_conflict | one of "upsert", "skip" | no | Default "upsert". |
segments | array of object | no | At most 50 items. |
segments[]. | string | yes | A UUID. |
topics | array of object | no | |
topics[]. | string | yes | A UUID. |
topics[]. | one of "opt_in", "opt_out" | yes |
Response
202 Queued: object.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "contact_import" | yes | |
status | one of "queued", "in_progress", "completed", "failed" | yes | |
counts | object | yes | |
counts. | integer | yes | |
counts. | integer | yes | |
counts. | integer | yes | |
counts. | integer | yes | |
counts. | integer | yes | |
error | string or null | yes | |
errors | array of object | yes | |
errors[]. | integer | yes | |
errors[]. | string | yes | |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
completed_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/contacts/import \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content":"ZW1haWwsZmlyc3RfbmFtZQpqYW5lQGV4YW1wbGUuY29tLEphbmUK","column_map":{"email":"email","first_name":"first_name"}}'const result = await minket.contacts.import({
content: "ZW1haWwsZmlyc3RfbmFtZQpqYW5lQGV4YW1wbGUuY29tLEphbmUK",
column_map: {
email: "email",
first_name: "first_name"
}
});minket api importContacts --body '{"content":"ZW1haWwsZmlyc3RfbmFtZQpqYW5lQGV4YW1wbGUuY29tLEphbmUK","column_map":{"email":"email","first_name":"first_name"}}'from minket.api.contacts import import_contacts
from minket.models import ImportContactsBody
result = import_contacts.sync(client=client, body=ImportContactsBody.from_dict({"content":"ZW1haWwsZmlyc3RfbmFtZQpqYW5lQGV4YW1wbGUuY29tLEphbmUK","column_map":{"email":"email","first_name":"first_name"}}))var body minket.ImportContactsJSONRequestBody
res, err := client.ImportContactsWithResponse(ctx, body)List imports
GET /v1/contacts/import
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | integer | no | Default 20. |
after | query | string | no | A UUID. |
before | query | string | no | A UUID. |
status | query | one of "queued", "in_progress", "completed", "failed" | no |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "list" | yes | |
data | array of object | yes | |
data[]. | string | yes | A UUID. |
data[]. | "contact_import" | yes | |
data[]. | one of "queued", "in_progress", "completed", "failed" | yes | |
data[]. | object | yes | |
data[]. | integer | yes | |
data[]. | integer | yes | |
data[]. | integer | yes | |
data[]. | integer | yes | |
data[]. | integer | yes | |
data[]. | string or null | yes | |
data[]. | array of object | yes | |
data[]. | integer | yes | |
data[]. | string | yes | |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
has_more | boolean | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/contacts/import \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.contacts.imports.list();minket api listImportsfrom minket.api.contacts import list_imports
result = list_imports.sync(client=client)res, err := client.ListImportsWithResponse(ctx, &minket.ListImportsParams{})Get an import
GET /v1/contacts/import/{id}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "contact_import" | yes | |
status | one of "queued", "in_progress", "completed", "failed" | yes | |
counts | object | yes | |
counts. | integer | yes | |
counts. | integer | yes | |
counts. | integer | yes | |
counts. | integer | yes | |
counts. | integer | yes | |
error | string or null | yes | |
errors | array of object | yes | |
errors[]. | integer | yes | |
errors[]. | string | yes | |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
completed_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/contacts/import/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.contacts.imports.get("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api getImport 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.contacts import get_import
result = get_import.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.GetImportWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")Export contacts as CSV
POST /v1/contacts/export
A presigned download of up to 200,000 contacts, valid until expires_at (an hour at most).
Request body
| Field | Type | Required | Description |
|---|---|---|---|
segment_id | string | no | A UUID. |
status | one of "active", "unsubscribed", "bounced", "complained", "sunset" | no |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "export" | yes | |
download_url | string | yes | |
expires_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/contacts/export \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"active"}'const result = await minket.contacts.export({
status: "active"
});minket api exportContacts --body '{"status":"active"}'from minket.api.contacts import export_contacts
from minket.models import ExportContactsBody
result = export_contacts.sync(client=client, body=ExportContactsBody.from_dict({"status":"active"}))var body minket.ExportContactsJSONRequestBody
res, err := client.ExportContactsWithResponse(ctx, body)Send a custom event for a contact
POST /v1/contacts/events
Recorded in the contact's history; starts any automation triggered by this event.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
event | string | yes | 1 to 100 characters. |
contact_id | string | no | A UUID. |
email | string | no | An email address without display name. |
payload | map of any | no |
Response
202 Accepted: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "event" | yes | |
event | string | yes | |
runs_started | integer | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/contacts/events \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event":"signed_up","email":"jane@example.com","payload":{"plan":"pro"}}'const result = await minket.contacts.sendEvent({
event: "signed_up",
email: "jane@example.com",
payload: {
plan: "pro"
}
});minket api sendContactEvent --body '{"event":"signed_up","email":"jane@example.com","payload":{"plan":"pro"}}'from minket.api.contacts import send_contact_event
from minket.models import SendContactEventBody
result = send_contact_event.sync(client=client, body=SendContactEventBody.from_dict({"event":"signed_up","email":"jane@example.com","payload":{"plan":"pro"}}))var body minket.SendContactEventJSONRequestBody
res, err := client.SendContactEventWithResponse(ctx, body)List contact properties
GET /v1/contacts/properties
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "list" | yes | |
data | array of object | yes | |
data[]. | string | yes | A UUID. |
data[]. | "contact_property" | yes | |
data[]. | string | yes | |
data[]. | one of "string", "number", "boolean", "date" | yes | |
data[]. | string or number or boolean or null | yes | |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
has_more | boolean | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/contacts/properties \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.contacts.properties.list();minket api listContactPropertiesfrom minket.api.contacts import list_contact_properties
result = list_contact_properties.sync(client=client)res, err := client.ListContactPropertiesWithResponse(ctx)Define a contact property
POST /v1/contacts/properties
Request body
| Field | Type | Required | Description |
|---|---|---|---|
key | string | yes | 1 to 50 characters. |
type | one of "string", "number", "boolean", "date" | yes | |
fallback_value | string or number or boolean or null | no |
Response
201 Created: object.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "contact_property" | yes | |
key | string | yes | |
type | one of "string", "number", "boolean", "date" | yes | |
fallback_value | string or number or boolean or null | yes | |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/contacts/properties \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"key":"plan","type":"string"}'const result = await minket.contacts.properties.create({
key: "plan",
type: "string"
});minket api createContactProperty --body '{"key":"plan","type":"string"}'from minket.api.contacts import create_contact_property
from minket.models import CreateContactPropertyBody
result = create_contact_property.sync(client=client, body=CreateContactPropertyBody.from_dict({"key":"plan","type":"string"}))var body minket.CreateContactPropertyJSONRequestBody
res, err := client.CreateContactPropertyWithResponse(ctx, body)Delete a contact property
DELETE /v1/contacts/properties/{id}
Removes the property's value from every contact.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "contact_property" | yes | |
id | string | yes | |
deleted | true | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X DELETE https://api.minket.com/v1/contacts/properties/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.contacts.properties.delete("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api deleteContactProperty 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.contacts import delete_contact_property
result = delete_contact_property.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.DeleteContactPropertyWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")Get a contact (by id or email)
GET /v1/contacts/{id}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes |
Response
200 Success: Contact.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "contact" | yes | |
project_id | string | yes | A UUID. |
email | string | yes | |
first_name | string or null | yes | |
last_name | string or null | yes | |
unsubscribed | boolean | yes | |
status | one of "active", "unsubscribed", "bounced", "complained", "sunset" | yes | |
properties | map of string or number or boolean or null | yes | |
topics | array of object | yes | |
topics[]. | string | yes | A UUID. |
topics[]. | one of "opt_in", "opt_out" | yes | |
segment_ids | array of string | yes | |
last_sent_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
last_opened_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
last_clicked_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
updated_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/contacts/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.contacts.get("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api getContact 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.contacts import get_contact
result = get_contact.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.GetContactWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")Update a contact
PATCH /v1/contacts/{id}
Properties merge (null removes one); segments replaces the contact's static segments; topics sets the listed topics.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
first_name | string or null | no | At most 100 characters. |
last_name | string or null | no | At most 100 characters. |
unsubscribed | boolean | no | |
properties | map of string or number or boolean or null | no | |
segments | array of object | no | At most 50 items. |
segments[]. | string | yes | A UUID. |
topics | array of object | no | At most 50 items. |
topics[]. | string | yes | A UUID. |
topics[]. | one of "opt_in", "opt_out" | yes | |
source | string | no | At most 100 characters. |
Response
200 Success: Contact.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "contact" | yes | |
project_id | string | yes | A UUID. |
email | string | yes | |
first_name | string or null | yes | |
last_name | string or null | yes | |
unsubscribed | boolean | yes | |
status | one of "active", "unsubscribed", "bounced", "complained", "sunset" | yes | |
properties | map of string or number or boolean or null | yes | |
topics | array of object | yes | |
topics[]. | string | yes | A UUID. |
topics[]. | one of "opt_in", "opt_out" | yes | |
segment_ids | array of string | yes | |
last_sent_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
last_opened_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
last_clicked_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
updated_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X PATCH https://api.minket.com/v1/contacts/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"first_name":"Janet"}'const result = await minket.contacts.update("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", {
first_name: "Janet"
});minket api updateContact 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b --body '{"first_name":"Janet"}'from minket.api.contacts import update_contact
from minket.models import UpdateContactBody
result = update_contact.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client, body=UpdateContactBody.from_dict({"first_name":"Janet"}))var body minket.UpdateContactJSONRequestBody
res, err := client.UpdateContactWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", body)Delete a contact
DELETE /v1/contacts/{id}
Suppressions for the address stay.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "contact" | yes | |
id | string | yes | |
deleted | true | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X DELETE https://api.minket.com/v1/contacts/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.contacts.delete("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api deleteContact 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.contacts import delete_contact
result = delete_contact.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.DeleteContactWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")Consent ledger for a contact
GET /v1/contacts/{id}/consent
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
limit | query | integer | no | Default 20. |
after | query | string | no | A UUID. |
before | query | string | no | A UUID. |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "list" | yes | |
data | array of object | yes | |
data[]. | string | yes | A UUID. |
data[]. | "consent" | yes | |
data[]. | string | yes | A UUID. |
data[]. | string or null | yes | A UUID. |
data[]. | one of "subscribe", "unsubscribe", "double_optin_sent", "double_optin_confirmed", "import", "sunset", "resubscribe" | yes | |
data[]. | one of "api", "console", "import", "preference_center", "one_click", "list_unsubscribe", "double_opt_in", "automation", "system" | yes | |
data[]. | string or null | yes | |
data[]. | string or null | yes | |
data[]. | map of any or null | yes | |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
has_more | boolean | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/contacts/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/consent \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.contacts.consent("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api listContactConsent 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.contacts import list_contact_consent
result = list_contact_consent.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.ListContactConsentWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", &minket.ListContactConsentParams{})Send a double opt-in confirmation
POST /v1/contacts/{id}/optin
Emails the contact a link that confirms their subscription (to topic_id, or to marketing mail). The link expires after 72 hours. Sent through the send pipeline from a domain of the project.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
from | string | yes | An email address, optionally with a display name as Name <address>. 3 to 998 characters. |
subject | string | no | At most 998 characters. |
reply_to | string or array of string | no | One address, or an array of up to 50. |
topic_id | string | no | A UUID. |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "optin" | yes | |
contact_id | string | yes | A UUID. |
topic_id | string or null | yes | A UUID. |
email_id | string | yes | A UUID. |
expires_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/contacts/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/optin \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"from":"Acme <hello@mail.acme.example>"}'const result = await minket.contacts.optin("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", {
from: "Acme <hello@mail.acme.example>"
});minket api sendContactOptin 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b --body '{"from":"Acme <hello@mail.acme.example>"}'from minket.api.contacts import send_contact_optin
from minket.models import SendContactOptinBody
result = send_contact_optin.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client, body=SendContactOptinBody.from_dict({"from":"Acme <hello@mail.acme.example>"}))var body minket.SendContactOptinJSONRequestBody
res, err := client.SendContactOptinWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", body)