Gyda API
Keep your assistant up to date from your own tools. A spreadsheet, Zapier, Make or a script of your own can read your content, change live details, and create, edit or delete content items.
https://api.askgyda.com/v1
Overview
The API is push only: your systems tell Gyda what changed, and Gyda never connects to them or stores their credentials. Every call acts on one workspace, the one the key belongs to.
Two kinds of change behave differently. Live details (today's price, availability, a status line) reach guests the moment you send them. Titles, descriptions, new items and deletions land in the draft and reach guests after the next publish from the dashboard, exactly as when you make them in the editor.
- Available on the Pro and Business plans.
- Not in the API: publishing, photos and videos, call-to-action buttons, assistant settings. Those stay in the dashboard.
- Help center guide for non-developers: Connecting your own tools with the API.
Authentication
Create a key in the dashboard under Workspace Settings, on the "Developers" tab. Owners and admins can create and revoke keys; a workspace holds up to 5 active keys. The key is shown once; keep it like a password.
Send it on every call in the Authorization header, as Bearer and the key. Tools whose authentication form only offers a custom header can send it as X-Api-Key instead.
- A key belongs to the workspace, not to the person who created it, and keeps working until it is revoked.
- If the workspace drops below Pro or its plan lapses, its keys stop answering until the plan is back. Revoking never needs a plan.
Request
curl https://api.askgyda.com/v1/assistants \
-H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi"Requests and responses
Every address starts with https://api.askgyda.com/v1. Bodies are JSON with the header Content-Type: application/json, up to 100 KB. Ids are UUIDs; titles are never used to find anything.
A success answers 200 (201 for a new item) with the result inside "data". A refusal answers 4xx or 5xx with a fixed "error" word your code can test, a sentence in "message", and for validation errors a "details" list.
A success
{ "data": { ... } }A refusal
{
"error": "validation_error",
"message": "The request is not valid",
"details": ["\"title\" is required"]
}List assistants
GET/v1/assistants
The assistants of the workspace, oldest first. The id is what the other calls need.
Request
curl https://api.askgyda.com/v1/assistants \
-H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi"Response
{ "data": [
{ "id": "6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90", "title": "Hotel Aurora",
"slug": "hotel-aurora_ab12cd", "created_at": "2026-08-01T10:00:00.000Z" }
] }List an assistant's items
GET/v1/assistants/{assistantId}/items
Every content item of one assistant, oldest first, each with its live details and tag names. Descriptions are left out to keep the list small; read one item to get its description. Save the ids you need once, for example in a spreadsheet column next to the row they belong to.
Request
curl https://api.askgyda.com/v1/assistants/6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90/items \
-H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi"Response
{ "data": [
{ "id": "9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e",
"assistant_id": "6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90",
"title": "Grilled salmon", "slug": "grilled-salmon_x1y2z3",
"live_details": [
{ "key": "Price", "value": "17 euros", "source": "dashboard", "updated_at": "2026-09-20T09:12:00.000Z" }
],
"tags": ["mains"],
"updated_at": "2026-09-20T09:12:00.000Z" }
] }Read one item
GET/v1/items/{itemId}
One item with its description, as the visible text the owner sees in the editor.
Request
curl https://api.askgyda.com/v1/items/9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e \
-H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi"Response
{ "data": {
"id": "9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e",
"assistant_id": "6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90",
"title": "Grilled salmon", "slug": "grilled-salmon_x1y2z3",
"description": "Wild salmon from the morning market, grilled over oak.",
"live_details": [ ... ],
"tags": ["mains"],
"updated_at": "2026-09-20T09:12:00.000Z" } }Create an item
POST/v1/assistants/{assistantId}/items
A new content item in the assistant's draft. Guests find it after the next publish; its live details answer from then on.
- title (required): up to 100 characters.
- description (required): up to 2,000 characters. This is what the assistant answers from, so write it as you would in the editor.
- tags (optional): a list of tag names, each at least 3 characters, stored in lowercase. A name the assistant does not use yet is created.
- live_details (optional): name to value, as in the details update. Up to 10.
- Counts against the plan's limit of items per assistant; a full assistant answers 403 item_limit_reached.
Request
curl -X POST https://api.askgyda.com/v1/assistants/6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90/items \
-H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi" \
-H "Content-Type: application/json" \
-d '{
"title": "Pumpkin soup",
"description": "Roasted pumpkin, ginger and coconut milk. Vegan.",
"tags": ["starters"],
"live_details": { "Price": "6.50 euros" }
}'Response (201)
{ "data": {
"id": "3b7d0a44-2e1f-4c8a-9b6d-5f0e1a2b3c4d",
"assistant_id": "6f1c9c2e-4b7a-4f0e-9d3b-2a1c8e5f7b90",
"title": "Pumpkin soup", "slug": "pumpkin-soup_q8w2e4",
"description": "Roasted pumpkin, ginger and coconut milk. Vegan.",
"live_details": [
{ "key": "Price", "value": "6.50 euros", "source": "api", "updated_at": "2026-09-22T11:30:00.000Z" }
],
"tags": ["starters"],
"updated_at": "2026-09-22T11:30:00.000Z" } }Update live details
PATCH/v1/items/{itemId}/details
The call most integrations need. Guests hear the new values on their next question, with nothing to publish.
- Each name you send is set to its value. Names you leave out stay as they are.
- A value of null or "" removes that detail.
- Names match ignoring case, and the spelling already on the item is kept: sending price updates an existing Price.
- A name up to 50 characters, a value up to 200, 10 details per item after the update.
- Rows written here carry source "api" until someone changes the value in the dashboard.
Request
curl -X PATCH https://api.askgyda.com/v1/items/9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e/details \
-H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi" \
-H "Content-Type: application/json" \
-d '{ "details": { "Price": "18.50 euros", "Availability": "few portions left tonight" } }'Response
{ "data": {
"id": "9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e",
"live_details": [
{ "key": "Price", "value": "18.50 euros", "source": "api", "updated_at": "2026-09-22T11:04:09.745Z" },
{ "key": "Availability", "value": "few portions left tonight", "source": "api", "updated_at": "2026-09-22T11:04:09.773Z" }
] } }Removing one
curl -X PATCH https://api.askgyda.com/v1/items/9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e/details \
-H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi" \
-H "Content-Type: application/json" \
-d '{ "details": { "Availability": null } }'Update title or description
PATCH/v1/items/{itemId}
Either field or both; a title is up to 100 characters. The change lands in the draft and reaches guests after the next publish. Tags, media and buttons are not touched. A description sent here replaces the whole text as plain words, so @-mentions of other items made in the editor are not kept.
Request
curl -X PATCH https://api.askgyda.com/v1/items/9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e \
-H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi" \
-H "Content-Type: application/json" \
-d '{ "description": "Wild salmon from the morning market, grilled over oak, with seasonal greens." }'Delete an item
DELETE/v1/items/{itemId}
Removes the item from the dashboard at once, the same as its Delete button. Guests stop finding it after the next publish. There is no undo through the API.
Request
curl -X DELETE https://api.askgyda.com/v1/items/9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e \
-H "Authorization: Bearer gyda_k7Pq2mVt9XcR4bNw8ZsL1dHf6JyG3aQe5TuM0oWi"Response
{ "data": { "id": "9c4e1f20-8d3a-4c5b-b7e6-0f1a2b3c4d5e", "deleted": true } }Errors
The error words are stable; test them rather than the sentence, which may be reworded.
| HTTP | error | When |
|---|---|---|
| 401 | missing_api_key | No key on the request. |
| 401 | invalid_api_key | The key is unknown or was revoked. |
| 403 | plan_required | The workspace is below the Pro plan. |
| 403 | subscription_inactive | The workspace's plan has lapsed. |
| 403 | item_limit_reached | The assistant already holds as many items as the plan allows. |
| 400 | validation_error | The body or a parameter is malformed, or the body is not JSON. "details" lists each problem. |
| 400 | too_many_details | The item would carry more than 10 live details. |
| 413 | validation_error | The body is over 100 KB. |
| 400 | request_rejected | Another rule refused the change; the message says which. |
| 404 | assistant_not_found | No assistant with that id in your workspace. |
| 404 | item_not_found | No content item with that id in your workspace. |
| 404 | not_found | No such endpoint. |
| 429 | rate_limited | More than 600 calls in an hour from this key. See Retry-After. |
| 500 | internal_error | Something failed on our side. Try again later. |
Rate limits
600 calls per hour per key, across every endpoint, on every plan. Each authenticated answer says where you stand; a 429 adds Retry-After with the seconds to wait.
In front of that, the edge limits bursts per address (240 calls a minute, 60 at once). No single integration comes near it; a caller that does gets a plain 429 without the JSON body.
Response headers
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 587
X-RateLimit-Reset: 1790078627Zapier and Make
Both work today through their generic web request step: "Webhooks by Zapier" (Custom Request) and the "HTTP" module in Make (Make a request).
A typical recipe: a spreadsheet row changes, the step sends PATCH to the details address of the item whose id sits in that row, with the Authorization header and a body built from the row, for example {"details": {"Price": "<price column>"}}.
- Use one key per tool and name it after the tool, so you can revoke one without touching the others.
- Store item ids next to your rows once; look them up with the items list call.