Cards
This object represents a card in Recall. All cards belong to a deck and are structured in its deck fields.
Endpoints
POST /v1/cards # Create a new cardPOST /v1/cards/batch # Create multiple cardsPOST /v1/cards/:id # Update a cardGET /v1/cards # List all cardsGET /v1/cards/:id # Get a cardDELETE /v1/cards/:id # Delete a card
The card object
{"id": "card_lBsPlNZe4356","object": "card","autofill": null,"content": {"french_word": "Bonjour","translation": "Hello","sentence": "<p><strong>Bonjour</strong>, comment ça va?</p>","sentence_translation": "<p><strong>Hello</strong>, how are you?</p>",},"created_at": "2025-11-30T12:34:56Z","deck": "deck_5gvuzRdHW2ac","next_review_at": "2025-12-01T12:34:56Z",}
id stringUnique identifier for the card.
object string, value is "card"The type of the object.
autofill nullable objectSummary of the AI Autofill state for this card, or null if no field on this card was ever scheduled for autofill. See the AI Autofill object for more details.
content objectObject containing the values of the content of the card for each deck field. The keys of the object are the deck_field.key values. Learn more about keys in the deck fields documentation.
Image and audio fields are included as keys but always read as null: their values are currently not exposed through the API.
created_at stringThe date and time the card was created. RFC 3339–formatted UTC datetime.
The ID of the deck the card belongs to. When deck is included in expand, this is a deck object instead.
next_review_at nullable stringThe earliest date and time the card is scheduled for review across its card layouts, or null when the card is not yet scheduled. Newly created cards stay unscheduled until they enter your review queue. RFC 3339–formatted UTC datetime.
Because deck fields can always be created, deleted or renamed (which updates their key values), it is recommended to always fetch them before creating or updating cards.
Create a card
curl https://api.recall.cards/v1/cards \-u YOUR_API_KEY: \-H "Content-Type: application/json" \-d '{"deck": "deck_5gvuzRdHW2ac","content": {"french_word": "Bonjour","translation": "Hello","sentence": "<p><strong>Bonjour</strong>, comment ça va?</p>","sentence_translation": "<p><strong>Hello</strong>, how are you?</p>"}}'
deck string requiredThe ID of the deck the card belongs to.
content object requiredObject containing the values of the content of the card for each deck field. The keys of the object are the deck_field.key values.
The validation of the content values depends on the deck field types. Refer to the deck fields types for more details.
It will also validate that the content of the card shown on the front side of the card in the primary layout has at least a value, or will be AI generated on creation.
trigger_autofill boolean, default is trueWhether to trigger AI Autofill for fields that have it enabled and whose source fields have values. AI Autofill runs asynchronously after the card is created. See the AI Autofill object.
Fields that themselves depend on AI-generated fields will also be successively enriched.
Fields whose value is explicitly provided in content are never scheduled for generation; your value prevails.
Editing image and audio fields in a card's content is not supported in the API at the moment.
Batch create cards
Create several cards in a deck in a single request.
All cards in a batch belong to the same deck: provide the deck once, and the cards in the data array. You can create up to 100 cards per request.
The batch is validated as a whole. If any card is invalid (for example an unknown field key, or a missing front value), the entire batch is rejected and no card is created. Duplicate cards are the only exception: instead of failing the request, they are skipped and reported in the response.
A card is considered a duplicate when its front side in the primary layout matches another card. The check runs against both the cards already in the deck and the cards in the same batch.
curl https://api.recall.cards/v1/cards/batch \-u YOUR_API_KEY: \-H "Content-Type: application/json" \-d '{"deck": "deck_5gvuzRdHW2ac","data": [{ "content": { "french_word": "Bonjour", "translation": "Hello" } },{ "content": { "french_word": "Merci", "translation": "Thank you" } }]}'
deck string requiredThe ID of the deck all the cards in the batch belong to.
data array of objects requiredThe cards to create, between 1 and 100. Each object accepts the same parameters as the create endpoint, except deck.
content object requiredObject containing the values of the content of the card for each deck field. The keys of the object are the deck_field.key values. Validated exactly like the create a card endpoint.
trigger_autofill boolean, default is trueWhether to trigger AI Autofill after the cards are created. It applies to every card in the batch. See the AI Autofill object. Fields whose value is explicitly provided in a card's content are never scheduled for generation.
The total number of cards in the deck (existing cards plus the batch) cannot exceed the per-deck limit of 5,000 cards. If it would, the whole batch is rejected.
Returns
{"object": "list","data": [// Created card objects, in the order they appear in the request (skipped duplicates excluded)],"skipped": [{ "index": 3, "reason": "duplicate" }]}
object string, value is "list"The type of object returned.
data arrayAn array containing the created card objects, in the same order as the request. Skipped duplicates are not included.
skipped array of objectsThe cards that were not created because they duplicate an existing or earlier card. Empty when nothing was skipped.
index integerThe position of the skipped card in the request's data array.
reason string, value is "duplicate"Why the card was skipped.
Update a card
curl https://api.recall.cards/v1/cards/card_5gvuzRdHW2ac \-u YOUR_API_KEY: \-H "Content-Type: application/json" \-d '{"content": {"sentence": "<p><strong>Bonjour</strong>, je voudrais un croissant.</p>"}}'
content objectObject containing the values of the content of the card for each deck field. The keys of the object are the deck_field.key values.
Updates are partial: keys present in the request are updated, keys absent are left unchanged, and keys set to null are cleared.
The validation of the content values depends on the deck field types. Refer to the deck fields types for more details.
It will also validate that the content of the card shown on the front side of the card in the primary layout has at least a value, or will be AI generated on update.
trigger_autofill boolean, default is trueWhether to trigger AI Autofill for fields that have it enabled and whose source fields are being updated. AI Autofill runs asynchronously after the card is updated. See the AI Autofill object.
Fields that themselves depend on AI-generated fields will also be successively enriched.
Fields whose value is explicitly provided in content in this request are not scheduled for generation.
Returns
Returns the updated card object.
The AI Autofill object
When you create or update a card with trigger_autofill: true (the default), Recall asynchronously runs AI generation for all fields that:
- Have AI Autofill enabled
- Have source fields with values
- Do not have a value explicitly provided in the request
Chained generation may also happen if a field depends on other AI-generated fields.
Generation draws from your plan's AI Autofill quota (and image generation credits for image fields). Fields that would exceed your remaining quota are skipped and stay empty; the card itself is still created or updated.
When AI Autofill has been triggered for a card, the autofill object is updated to reflect the status of the generation. It is null if no field's value was ever generated with AI Autofill.
{"id": "card_lBsPlNZe4356","object": "card","autofill": {"status": "pending","fields": {"illustration": { "status": "pending" },"pronunciation": { "status": "failed" }}},"content": {"french_word": "Bonjour","translation": "Hello","illustration": null,"pronunciation": null,},// ...}
status enumCard-level rollup of every scheduled field.
pendingcompletefailedpartialfields objectPer-field state. Keys are deck_field.key values. Only fields that were scheduled for autofill appear in this object.
status enumState of the field.
pendingcontent is null.completecontent is populated.failedcontent remains null.List all cards
curl https://api.recall.cards/v1/cards \-u YOUR_API_KEY:
deck stringFilter the cards by the ID of the deck the card belongs to.
limit optional, default is 10The maximum number of cards to return, ranging between 1 and 100.
starting_after optionalA cursor to use in pagination. starting_after is a card ID that defines your place in the list. For example, if you make a card list request and receive 100 cards, ending with card_2sdInOpM83eo, your subsequent call can include starting_after=card_2sdInOpM83eo to fetch the next page of the list.
ending_before optionalA cursor to use in pagination. Similarly to starting_after, ending_before is a card ID that allows you to fetch cards in the previous page of the list.
Returns
{"object": "list","has_more": true,"data": [// Card objects...],}
object string, value is "list"The type of object returned.
data arrayAn array containing the card objects.
has_more booleanWhether or not there are more elements available after this set. If false, this set comprises the end of the list.
Get a card
curl https://api.recall.cards/v1/cards/card_5gvuzRdHW2ac \-u YOUR_API_KEY:
There are no parameters for this endpoint.
Returns
Returns the card object.
Delete a card
curl https://api.recall.cards/v1/cards/card_5gvuzRdHW2ac \-u YOUR_API_KEY: \-X DELETE
There are no parameters for this endpoint.
Returns
{"id": "card_5gvuzRdHW2ac","object": "card","deleted": true}